Entwickler-Ecke
Windows API - Postmessage und WM_LBUTTONDOWN will nicht
fuba - Mo 30.08.10 02:21
Titel: Postmessage und WM_LBUTTONDOWN will nicht
hi @ all
habe folgendes problem:
ich will an ein fenster einen mausclick senden.
dass funktioniert auch wunderbar, solange das fenster fokusiert ist, jedoch nicht wenn das fenster minimiert ist oder den fokus verliert.
code, welcher nicht funktioniert:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure LeftClick(wnd: hwnd; PosX, PosY: integer); begin PostMessage(wnd, WM_MOUSEMOVE , 0 , MakeLParam(PosX, PosY)); PostMessage(Wnd, WM_LBUTTONDOWN, MK_LBUTTON, MakeLParam(PosX, PosY)); PostMessage(Wnd, WM_LBUTTONUP , MK_LBUTTON, MakeLParam(PosX, PosY)); end; |
das interessante daran ist, das bewegen der maus funktioniert, auch bei nicht fokusiertem fenster, aber der click nicht *confused*
habe schon überall gesucht, aber keine passende lösung gefunden.
man kann das fenster wiederherstellen und dann in den vordergund holen, etwa so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure LeftClick(wnd: hwnd; PosX, PosY: integer); begin PostMessage(wnd, WM_SYSCOMMAND, SC_RESTORE, 0); BringWindowToTop(wnd); SetForeGroundWindow(wnd); PostMessage(wnd, WM_MOUSEMOVE , 0 , MakeLParam(PosX, PosY)); PostMessage(Wnd, WM_LBUTTONDOWN, MK_LBUTTON, MakeLParam(PosX, PosY)); PostMessage(Wnd, WM_LBUTTONUP , MK_LBUTTON, MakeLParam(PosX, PosY)); end; |
damit funktioniert es wunderbar.
jedoch währe es mir lieber, wenn ich dass nicht machen müsste, gibts da ne lösung?
danke für eure vorschläge/hilfe :)
elundril - Mo 30.08.10 04:27
Hast du mal probiert den Rückgabewert abzufragen? Dafür sind die eigentlich da. Wenn er 0 ist, dann hat was nicht geklappt und du rufst besser mal GetLastError auf. ;)
Btw, gibts einen Grund warum nicht SendMessage? Was ich so bei MSDN gelesen hab ist SendMessage extra für Fenster gemacht worden, während PostMessage eher für Threads ist. (Wenn ich Blödsinn rede bitte mich korrigieren.)
lg elundril
delfiphan - Mo 30.08.10 07:46
Wenn PostMessage abgeschlossen ist, wurde die Aktion (idr) noch nicht ausgeführt, daher beinhaltet der Rückgabewert die gewünschte Information nicht (höchstens vielleicht, ob der Handle ungültig war).
Ich würd's auch mal mit SendMessage probieren (oder eine der Varianten, z.B. SendMessageCallback).
fuba - Mo 30.08.10 15:51
SendMessage auch schon versucht, was aber dabei komisch war, mit Sendmessage funktionierte es nichtmal mehr wenn das fenster fokus hatte.
werde mir mal bei Sendmessage das result ansehen.
// EDIT //
PostMessage gibt immer "True" zurück, auch wenn das fenster minimiert ist und der click nicht funktioniert.
SendMessage gibt immer "0" zurück, daher funktioniert weder movemouse noch ein click
(was ich aber komisch finde, denn wenn das fenster den fokus hat, clickt/moved psotmessage ja, aber warum sendmessage nicht?)
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!