Einzelnen Beitrag anzeigen

Benutzerbild von erich.wanker
erich.wanker

Registriert seit: 31. Jan 2008
Ort: im schönen Salzburger Land
461 Beiträge
 
Delphi XE4 Professional
 
#1

..und noch ein: Maus windowsweit fernsteuern...

  Alt 18. Sep 2009, 18:30
Hallo Leute...
(leider bin ich durch die Forumsuchen nicht schlauer geworden)

ich hab mal eine Frage betreffend Maus-Klicks simulieren:
Wenn ich die Maus positionieren will, kann ich das via Mouse.Cursorpos
Wenn ich Klicks ausführen will, kann ich das via WindowMessages (wm_LButtonDown..)

Nur: Funktionieren tuts nicht so richtig...

Manche Fenster nehmen [ok] [Abbruch] nicht an.
(Was ich sehr komisch finde ist:
IE8/Extras/Internetoptionen funzt nicht
IE8/Favoriten/Zu Favoriten hinzufügen.. funktioniert
)

Excel reagiert komisch bei einem simulierten Linksklick in ein Feld
und nach einiger Zeit kommt ein StackOverflow im Delphi

Code:
Delphi-Quellcode:
// Linke Maustaste
procedure TForm1.BitBtn1Click(Sender: TObject);
var
CursorPos: TPoint;
WinHandle: HWND;
LongParam: Integer;
begin
GetCursorPos(CursorPos);
WinHandle := WindowFromPoint(CursorPos);
Windows.ScreenToClient(WinHandle, CursorPos);
LongParam := CursorPos.x + CursorPos.y shl 16;
SendMessage(WinHandle, WM_LBUTTONDOWN, 0, LongParam);
SendMessage(WinHandle, WM_LBUTTONUP, 0, LongParam);
{
Mouse_Event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
Mouse_Event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
}

end;


// Rechte Maustaste
procedure TForm1.BitBtn2Click(Sender: TObject);
var
CursorPos: TPoint;
WinHandle: HWND;
LongParam: Integer;
begin
GetCursorPos(CursorPos);
WinHandle := WindowFromPoint(CursorPos);
Windows.ScreenToClient(WinHandle, CursorPos);
LongParam := CursorPos.x + CursorPos.y shl 16;
SendMessage(WinHandle, WM_RBUTTONDOWN, 0, LongParam);
SendMessage(WinHandle, WM_RBUTTONUP, 0, LongParam);
{
Mouse_Event(MOUSEEVENTF_RightDOWN, 0, 0, 0, 0);
Mouse_Event(MOUSEEVENTF_RightUP, 0, 0, 0, 0);
}

end;


// Doppelklick
procedure TForm1.BitBtn3Click(Sender: TObject);
var
CursorPos: TPoint;
WinHandle: HWND;
LongParam: Integer;
begin
GetCursorPos(CursorPos);
WinHandle := WindowFromPoint(CursorPos);
Windows.ScreenToClient(WinHandle, CursorPos);
LongParam := CursorPos.x + CursorPos.y shl 16;
SendMessage(WinHandle, WM_LBUTTONDOWN, 0, LongParam);
SendMessage(WinHandle, WM_LBUTTONDBLCLK, 0, LongParam);
SendMessage(WinHandle, WM_LBUTTONUP, 0, LongParam);
{
Mouse_Event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
Mouse_Event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
Mouse_Event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
Mouse_Event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
}

end;


P.S.: Ich starte die Proceduren in diesem Beispiel über einen Tastaturhook von LMD ..

Delphi-Quellcode:
procedure TForm1.LMDGlobalHotKey1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
bitbtn1.Click;
end;
kann mir einer sagen, wieso sich das so komisch verhält,
und wie ich das ganze lösen kann.

Sinn und Zweck der Übung:

Ich hab mir grad eine 3x2 Meter Rückprojektionsfläche gekauft, will mit dem Beamer eine Software drauf projezieren und via 2 Webcams (die nur einen kleinen "Sehschlitz" besitzen) ein "Ein-Finger-Eingabesystem" basteln, indem die beiden Videostreams analysiert werden und die Position eines Fingers berechnet wird .. und es scheitert schon am "Maus positionieren und klick ausführen"
Erich Wanker - for life:=1971 to lebensende do begin ..
  Mit Zitat antworten Zitat