Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi ..und noch ein: Maus windowsweit fernsteuern... (https://www.delphipraxis.net/140466-und-noch-ein-maus-windowsweit-fernsteuern.html)

erich.wanker 18. Sep 2009 17:30


..und noch ein: Maus windowsweit fernsteuern...
 
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" :wall:

jfheins 18. Sep 2009 19:24

Re: ..und noch ein: Maus windowsweit fernsteuern...
 
Rein aus Interesse: warum hast du die mouse_event dinger auskommentiert? Ich hätte es genau so (oder mit SendInput) gemacht :gruebel:

erich.wanker 19. Sep 2009 10:27

Re: ..und noch ein: Maus windowsweit fernsteuern...
 
Hi,

"die mouse_event dinger " - funktionieren noch schlechter in Word, Excel und IExplorer als die Sendmessage-Nachrichten.

Komischerweise reagiert z.B.: Excel bei manchen Popups ganz normal, manche klappen auf, nehmen aber dann keinen linksklick auf ein Item an .. lauter so Sachen .. :gruebel:
Wenn man ein Feld "anklicken läßt" - und ein Zellhaufen ist bereits markiert, ist die Reaktion von Excel wieder anders, als wenn nix markiert ist..


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz