Autor Beitrag
Moewe2
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mi 09.10.02 13:02 
Hallo,
ich möchte in einem Fenster von einem anderen Programm einen Button klicken, weiß aber nciht wie. Ich ahbe bereits folgendes Versucht:
ausblenden 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?

_________________
Baut keine Atomraketen!
Die alten sind doch noch garnicht aufgebraucht.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106

Win95-2003 / Debian / Suse
D1/D3/D6/D7
BeitragVerfasst: Mi 09.10.02 14:55 
Hallo,

du hast die Parameter mißverstanden, in der Delphi Hilfe steht folgendes:

ausblenden 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:
ausblenden 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:
ausblenden 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

_________________
Wenn es im Jahre 1879 schon Computer gegeben hätte, würden diese vorausgesagt haben, daß man infolge der Zunahme von Pferdewagen im Jahre 1979 im Pferdemist ersticken würde.
(John C. Edwards, brit. Zukunftsforscher)
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106

Win95-2003 / Debian / Suse
D1/D3/D6/D7
BeitragVerfasst: 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

_________________
Wenn es im Jahre 1879 schon Computer gegeben hätte, würden diese vorausgesagt haben, daß man infolge der Zunahme von Pferdewagen im Jahre 1979 im Pferdemist ersticken würde.
(John C. Edwards, brit. Zukunftsforscher)
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 09.10.02 15:44 
Jupp stimmt. Aber ich bin bequem. :?
Moewe2 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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.

_________________
Baut keine Atomraketen!
Die alten sind doch noch garnicht aufgebraucht.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 10.10.02 13:48 
Aber denk dran, das was du da jetzt machst ist sehr unsicher! Nimm lieber BM_CLICK.
Moewe2 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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).

_________________
Baut keine Atomraketen!
Die alten sind doch noch garnicht aufgebraucht.