![]() |
Mausklick an ein bestimmtes Handle senden.
Aloa,
wieder einmal bitte ich um euren Rat. Ich sitzte derzeit an einem Programm, mit dem ich einen Mausklick an ein bestimmtes Fenster, auf eine bestimmte Position senden möchte. Ich habe es bereits mit verschiedenen Varianten versucht, doch immer nur mit teilweisem, oder gar keinem Erfolg. Am besten zeige ich euch diese erst einmal: Mit diesem gelingt es mir, meine Cursor an eine gewünschte Position zu bewegen, der Klick wird an der Position (400/300) des Bildschirmes ausgeführt, nicht des Fensters.
Delphi-Quellcode:
Diese Art habe ich im Internet gefunden,
procedure TForm1.Button1Click(Sender: TObject);
var p : TWindowPlacement ; x, y : Integer; hwnd : THandle; begin hwnd := FindWindow('Testfenster', nil); GetWindowPlacement(hwnd, @p); x := p.rcNormalPosition.left+400; y := p.rcNormalPosition.top+300; SetCursorPos(x,y); mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0); end; doch einen gewünschten Effekt hat es in keiner Hinsicht ausgeführt.
Delphi-Quellcode:
Auch diese bringt keinen Effekt.
procedure TForm1.Button1Click(Sender: TObject);
begin PostMessage(FindWindowEx(FindWindow('Testfenster', nil),0, 'Button', nil), WM_LBUTTONDOWN, MK_LBUTTON, MAKELONG(100, 100)); PostMessage(FindWindowEx(FindWindow('Testfenster', nil),0, 'Button', nil), WM_LBUTTONUP, MK_LBUTTON, MAKELONG(100, 100)); end;
Delphi-Quellcode:
Genauso wie diese.
procedure TForm1.Button1Click(Sender: TObject);
const x = 100; y = 100; xy = x or y shl 16; var hwnd: THandle; begin Wnd := FindWindow(nil, 'Testfenster'); PostMessage(hwnd, WM_MOUSEMOVE , 0 , xy); PostMessage(hwnd, WM_LBUTTONDOWN, MK_LBUTTON, xy); PostMessage(hwnd, WM_LBUTTONUP , 0 , xy); end;
Delphi-Quellcode:
Hier habe ich den ersten und dritten ein bisschen zusammen gehauen,
procedure TForm1.Button1Click(Sender: TObject);
var hwnd : THandle; begin hwnd := FindWindow('Testfenster', nil); SendMessage(hwnd, MOUSEEVENTF_LEFTDOWN, 0, 0); SendMessage(hwnd, MOUSEEVENTF_LEFTUP, 0, 0); end; der Effekt bleibt aber wie der des ersten.
Delphi-Quellcode:
Deswegen meine Frage:
procedure TForm1.Button1Click(Sender: TObject);
const x = 400; y = 300; xy = x or y shl 16; var p : TWindowPlacement ; hwnd : THandle; begin hwnd := FindWindow('Testfenster', nil); SetCursorPos(x,y); mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0); PostMessage(hwnd, WM_MOUSEMOVE , 0 , xy); PostMessage(hwnd, WM_LBUTTONDOWN, MK_LBUTTON, xy); PostMessage(hwnd, WM_LBUTTONUP , 0 , xy); end; wie würde der Source aussehen müssen, damit der Klick immer 400/300 im Fenster "Testfenster" ausgeführt wird, egal wo sich das Fenster auf dem Bildschirm befindet? Ich freue mich auf etwas Hilfe. Mit freundlichem Gruß Lostriga |
Re: Mausklick an ein bestimmtes Handle senden.
Du kannst ja zuerst nachschauen wo sich das Fenster befindet und dann deine Koordinaten umrechnen. Dafür dürfte diese Funktion nützlich sein: ;-)
![]() |
Re: Mausklick an ein bestimmtes Handle senden.
Hallo
Stimmt denn das Fenster Handle? Mache doch eine Überprüfung auf <> 0. |
Re: Mausklick an ein bestimmtes Handle senden.
Aloa,
also ich habe es mal damit versucht:
Delphi-Quellcode:
Aber er setz das Fenster nicht in den Vordergrund, was mich daraus schließen lässt, das es gar nicht gefunden wird. :cry:
procedure TForm1.Button1Click(Sender: TObject);
var p : TWindowPlacement ; x, y : Integer; hwnd : THandle; begin hwnd := FindWindow('Testfenster', nil); if hwnd <> 0 Then begin BringWindowToTop(hwnd); SetActiveWindow(hwnd); begin GetWindowPlacement(hwnd, @p); x := p.rcNormalPosition.left+400; y := p.rcNormalPosition.top+300; SetCursorPos(x,y); mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0); end; end; end; Mit freundlichem Gruß Lostriga |
Re: Mausklick an ein bestimmtes Handle senden.
Dann ermittle das richtige Handle (z.B mit meinem WinSpy. Siehe Signatur)
|
Re: Mausklick an ein bestimmtes Handle senden.
Aloa,
ich habe es mal so versucht wie es auf einem deiner Pics im Thread deiner Signatur zu sehen ist.
Delphi-Quellcode:
Aber trotzdem findet er das Fenster nicht, noch dazu ändert sich ja das Handle des Testfenster,
procedure TForm1.Button1Click(Sender: TObject);
var p : TWindowPlacement ; x, y : Integer; hwnd : THandle; begin hwnd := FindWindow('Testfenster', '#553281'); // Den Handle des Fensters hab eich hier eingetragen. if hwnd <> 0 Then begin BringWindowToTop(hwnd); SetActiveWindow(hwnd); begin GetWindowPlacement(hwnd, @p); x := p.rcNormalPosition.left+400; y := p.rcNormalPosition.top+300; SetCursorPos(x,y); mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0); end; end; end; jedes mal wenn ich es erneut öffne. Und immer wieder das richtige erst per Spy raus zusuchen wär ja nicht das wahre. Oder geht das auch anders?, weil mit der einfachen Findwindow Funktion scheint es ja nicht zu funktionieren. Mit freundlichem Gruß Lostriga |
Re: Mausklick an ein bestimmtes Handle senden.
der Klassenname deines Fenster ist "Testfenster"? bei delphi wär das ja normal TFormx...ich vermute, du hast Classname (1.Parameter) und Caption (2.Parameter) vertauscht...
Gruß Frank |
Re: Mausklick an ein bestimmtes Handle senden.
Aloa,
ähm, nee. Also mit 'Testfenster meine ich halt ein richtiges Fenster. Wie z.B. Arbeitsplatz, Programme, etc., also man kann auch einen Neuen Ordner erstellen, und dann möchte ich halt statt 'Testfenster', das Fenster 'Neuer Ordner' (wenn dieser geöffnet ist). Mit freundlichem Gruß Lostriga |
Re: Mausklick an ein bestimmtes Handle senden.
in dem Fall müsstest du aber auch "Neuer Ordner" als Fenstertitel eingeben und nicht als Klasse...gib mal als ersten Parameter nil ein und als 2. den Fenstertitel.
Auszug aus dem PSDK von ![]() Zitat:
|
Re: Mausklick an ein bestimmtes Handle senden.
Aloa,
so Leutz, ^^, jetzt hab ich es. Hätte nicht gedacht, das eine Verdrehung von nil und 'Testfenster' so eine fatale Auswirkung haben kann.
Delphi-Quellcode:
Das Fenster wird jetzt gefunden, in den Vordergrund gesetzt und es wird,
procedure TForm1.Button1Click(Sender: TObject);
var p : TWindowPlacement ; x, y : Integer; hwnd : THandle; begin hwnd := FindWindow(nil, 'Testfenster'); if hwnd <> 0 Then begin BringWindowToTop(hwnd); SetActiveWindow(hwnd); begin GetWindowPlacement(hwnd, @p); x := p.rcNormalPosition.left+400; y := p.rcNormalPosition.top+300; SetCursorPos(x,y); mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0); end; end; end; egal wo sich das Fenster auf dem Desktop befindet, ein Klick auf der gewünschten Position "im" Fenster ausgeführt. Ich danke euch für eure hilfreichen Tips! Mit freundlichem Gruß Lostriga |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:17 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 by Thomas Breitkreuz