Entwickler-Ecke
Windows API - Button in Fremden Fenster klicken?
Moewe2 - Mi 09.10.02 13:02
Titel: Button in Fremden Fenster klicken?
Hallo,
ich möchte in einem Fenster von einem anderen Programm einen Button klicken, weiß aber nciht wie. Ich ahbe bereits folgendes Versucht:
Quelltext
1:
| Sendmessage(Fesnterhandle,WM_LBUTTONDOWN,XPos+78,YPos+18); |
Da passiert aber garnichts.
Ich glaube, dass ich die Koordinaten nicht so übergeben kann wie da oben, aber wie?
Delete - Mi 09.10.02 13:58
Mit FindWindow das Parent des Buttons finden, mit FindWindowEx den Button und dann die Nachricht BN_CLICK an den Button schicken.
Oder nach dem du mit FindWindow das Parentfenstergefunden hast und die ID des Buttons kennst (kann man mit Spy++ rausfinden), kommst du auch mit GetDlgItem an das Handle von dem Button ran um dann die Nachricht zu schicken.
SMI - Mi 09.10.02 14:55
Hallo,
du hast die Parameter mißverstanden, in der Delphi Hilfe steht folgendes:
Quelltext
1: 2: 3: 4: 5:
| WM_LBUTTONDOWN
fwKeys = wParam; // key flags xPos = LOWORD(lParam); // horizontal position of cursor yPos = HIWORD(lParam); // vertical position of cursor |
fwKey ist der wParam Parameter , bei dir MK_Control,
Dann ist xPos der untere Word Anteil des lParam und yPos der obere Word Anteil.
Folgendes Diagramm müsste den Zusammenhang die klarmachen:
Quelltext
1: 2: 3:
| |********************************| lparam = 32-Bit |**************** | HiWord 32 Bit = 16Bit | ****************| LoWord 32Bit = 16Bit |
Am einfachsten fügt man einen Integer Wert ein (X) und dann einem um 16 bit nach Links verschobenen weiteren Integerwert. Richtigerweise müsste man hier noch eine Bereichprüfung da auf 32 BitSystemen ein Integer 32-Bit lang ist und man hier ja nur 16 verwendet, wenn man die Werte selber Einträgt, kann man getrost darauf Verzichten.
Desweiteren musst du beachten, dass man 2 Nachrichten versenden muss, wenn man in Delphi einen OnClick Ereignis simulieren will. Eine, dass der Button gedrückt wurde, die anderen, dass der losgelassen wurde. In VC++ hingegen benutzt man meistens entweder nur WM_LBUTTONUP oder nur WM_LBUTTONDOWN, man kann aber auch beide verwenden. Welche Variante der Programierer implementiert dort seine Entscheidung, also musst du ausprobieren, ob der Button auf Down bzw. Up oder auf beides reagiert. Im Zweifelsfall einfach beides schicken.
Um auf der Position (1/10) des Formulars zu clicken kann man folgende Zeilen benutzen:
Quelltext
1: 2: 3: 4:
| BEGIN Sendmessage(Form1.Handle,WM_LBUTTONDOWN,MK_CONTROL,1+(10 shl 16)); Sendmessage(Form1.Handle,WM_LBUTTONUP,MK_CONTROL,1 + (10 shl 16)); END; |
SMI
Delete - Mi 09.10.02 15:06
Oder man nimt:
Zitat: |
The MAKELPARAM macro creates a value for use as an lParam parameter in a message. The macro concatenates the specified values.
|
Aber für seinen Zweck recht unsicher, wenn nicht sogar unbrauchbar. Fenster kann man ja verschieben. Meine Methode jhingegen sollte etwas sicherer sein. 8)
SMI - Mi 09.10.02 15:42
Man kann auch einfach Delphi Casts verwenden:
Sendmessage(Form1.Handle,WM_LBUTTONDOWN,MK_CONTROL,WORD(0)+(WORD(10) shl 16));
Sendmessage(Form1.Handle,WM_LBUTTONUP,MK_CONTROL,WORD(1) + (WORD(10) shl 16));
WORD(1) + (WORD(10) shl 16)
Da der Ausdruck nur aus Casts und Operatoren besteht ist er im Delphi schneller als jede Funktion. Denn MAKELPARAM ist in Delphi als eine Funktion, bei C hingegen als ein Makro( sehr grob gesagt Hochoptimiere Assembler Fragmente) deffiniert. Wenn du Debuggen kannst wirst du feststellen, das aus der obigen Quellcode schnipsel keine Funktion führt, sogar nichtmal eine Versteckter Funktionsaufruf vom Compiler.
Somit würde ich in Delphi auf jeden Fall die Cast-Variante vorziehen.
Da aber sogut wie Keiner mit TypeCasts richtig umgehen kann, habe ich in meine Letzten Posting nur erwähnt dass es ein Problem geben kann.
SMI
Delete - Mi 09.10.02 15:44
Jupp stimmt. Aber ich bin bequem. :?
Moewe2 - Do 10.10.02 13:42
Titel: :think: Danke
Danke für die Tipps,
habs zwar noch nich ausprobiert, hört sich aber logisch an. Ich ahnte ja schobn, dass ich die Parameter falsch benutzt hatte.
Delete - Do 10.10.02 13:48
Aber denk dran, das was du da jetzt machst ist sehr unsicher! Nimm lieber BM_CLICK.
Moewe2 - Do 10.10.02 14:51
Naja, meinst du mit unsicher, dass die Fensterposition sich ändern kann, oder wie?
Wenn du das meinst, dann kann ich dich beruhigen, da ich jenes Fenster ja ein Schritt vorher selbst verschiebe, also genau weiß, wo es ist.
Außerdem wüsste ich nicht, wie ich das Handle von einem Button bekomme, oder ob das da überhaupt ein Button ist, es könnte auch ein einfaches Label sein, sieht n bisschen aus wie ein Link (Isses aber nich).
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!