andere Anwendung steuern mit SendMessage

06/10/2009 - 15:20 von Christoph Engelhardt | Report spam
Hallo NG,

ich habe da mal folgendes Problem:

Meine Anwendung steuert bisher eine andere Anwendung mittels AutoIt3
bzw. über die Send-Methode.
Jetzt ist ja diese Methode doch sehr fehleranfàllig (z.B. anderes
Fenster wird wàhrend der Übertragung aktiviert).

Folglich würde ich sehr gerne per SendMessage / PostMessage
Nachrichten verschicken.

Also habe ich mittels Spy++ mir angesehen, was das Fenster so an
Nachrichten bekommt und versucht die wichtigen nachzubasteln.
Allerdings hat das überhaupt nicht geklappt.
Ich sende zwar fleißig Window messages, aber irgendwie werden die vom
Programm nicht so verarbeitet wie wenn ich die Tasten selbst drücke.
Nur mal so als Anhalt:
Um das Datei Menü zu öffnen sende ich folgende Nachrichten:
WM_SYSCOMMAND
WM_ENTERMENULOOP
WM_INITMENU
WM_MENUSELECT
WM_INITMENUPOPUP
WM_ENTERIDLE


Wàre für wirklich jede Hilfe dankbar.


*********************************************
Was mich außerdem noch beschàftigt:

ich habe mehrere enums der Form
"public enum WindowMessages : int"

wenn ich die jetzt an die Funktion
public void SendMessage(IntPtr aHandle, int aMsg, int aWParam, int
aLParam)

mit
SendMessage(hwnd, WindowMessages.WM_SYSCOMMAND, 0, 0) reinhauen will

verfüttern will, dann motzt der Compiler, da er WindowMessages nicht
nach int konvertieren kann.
Wie kann ich denn hier eine implizite Konvertierung erreichen?

Danke Danke Danke
Christoph
 

Lesen sie die antworten

#1 Frank Dzaebel
06/10/2009 - 19:22 | Warnen spam
Hallo Christoph,

ich habe da mal folgendes Problem:
Meine Anwendung steuert bisher eine andere Anwendung mittels AutoIt3
bzw. über die Send-Methode.



Du meinst wahrscheinlich SendKeys.Send(...)

Jetzt ist ja diese Methode doch sehr fehleranfàllig (z.B. anderes
Fenster wird wàhrend der Übertragung aktiviert).
Folglich würde ich sehr gerne per SendMessage / PostMessage
Nachrichten verschicken.



Sowas àhnliches haben wir gerade gehabt.
Direkte SendMessage's an externe Prozesse sind auch nicht
besonders sicher im Ergebnis. Es kommt da u.a. auf die
Prozess-Integritàt, das OS, die Art der Meldung,
Prozessorarchitektur, das Framework und die zur Verfügung
stehende Schnittstellen an. Ähnliches gilt für PostMessage:
http://www.meinews.net/showpost.php?p08066&postcount=2

Bei AutoIt3 stehen (kurz überflogen) durchaus COM-Schnittstellen
und DLL-API-Schnittstellen zur Verfügung. Dieses ist i.A.
sauberer und weniger fehleranfàllig.

[AutoIt v3 - Automate and Script Windows Tasks - For Free!]
http://www.autoitscript.com/autoit3/

Früher hat SendKeys über "JournalHook" über
SetWindowsHookEx gearbeitet, das ist ab .NET 3.0
anders, sodass ab Vista wieder ein gewissermassen
"erwartetes" Verhalten auftreten kann, denn es gibt hier
jetzt die "User Interface Privilege Isolation" (UIPI). Dazu muss
dann ggf. ein AppSetting in der app.config zugefügt werden
(möglich zum Beispiel: SendInput, JournalHook)



Also habe ich mittels Spy++ mir angesehen, was das Fenster so an
Nachrichten bekommt und versucht die wichtigen nachzubasteln.



und wenn sich bei irgendeinem HotFix die Messages oder
IDs àndern, stehst Du da, wàhrend Schnittstellen weitergeführt werden
können.



wenn ich die jetzt an die Funktion
public void SendMessage(IntPtr aHandle, int aMsg, int aWParam, int
aLParam) mit
SendMessage(hwnd, WindowMessages.WM_SYSCOMMAND, 0, 0)
verfüttern will, dann motzt der Compiler, da er WindowMessages nicht
nach int konvertieren kann.



dann könnte man ggf. über:
(int)WindowMessages.WM_SYSCOMMAND
konvertieren ;-)
bzw. eigentlich sind die "unit". Es kommt auch auf die Deklaration an.

Dennoch schau Dir mal die gàngigen DllImport's
der Methode an. Bedenke vor allen Dingen, dass
die auch auf x64 laufen sollten, also immer hübsch IntPrt oder
UIntPtr nutzen (etc.), etwa bei Handle's:

[pinvoke.net: SendMessage (user32)]
http://www.pinvoke.net/default.aspx...endMessage


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen