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 Mausklick an ein bestimmtes Handle senden. (https://www.delphipraxis.net/128250-mausklick-ein-bestimmtes-handle-senden.html)

Lostriga 26. Jan 2009 23:47


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:
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;
Diese Art habe ich im Internet gefunden,
doch einen gewünschten Effekt hat es in keiner Hinsicht ausgeführt.
Delphi-Quellcode:
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;
Auch diese bringt keinen Effekt.
Delphi-Quellcode:
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;
Genauso wie diese.
Delphi-Quellcode:
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;
Hier habe ich den ersten und dritten ein bisschen zusammen gehauen,
der Effekt bleibt aber wie der des ersten.
Delphi-Quellcode:
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;
Deswegen meine Frage:
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

jaenicke 27. Jan 2009 00:53

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: ;-)
http://msdn.microsoft.com/en-us/library/ms633519.aspx

toms 27. Jan 2009 05:14

Re: Mausklick an ein bestimmtes Handle senden.
 
Hallo

Stimmt denn das Fenster Handle?
Mache doch eine Überprüfung auf <> 0.

Lostriga 27. Jan 2009 18:29

Re: Mausklick an ein bestimmtes Handle senden.
 
Aloa,

also ich habe es mal damit versucht:
Delphi-Quellcode:
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;
Aber er setz das Fenster nicht in den Vordergrund, was mich daraus schließen lässt, das es gar nicht gefunden wird. :cry:


Mit freundlichem Gruß

Lostriga

toms 27. Jan 2009 19:06

Re: Mausklick an ein bestimmtes Handle senden.
 
Dann ermittle das richtige Handle (z.B mit meinem WinSpy. Siehe Signatur)

Lostriga 27. Jan 2009 23:15

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:
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;
Aber trotzdem findet er das Fenster nicht, noch dazu ändert sich ja das Handle des Testfenster,
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

_frank_ 28. Jan 2009 01:27

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

Lostriga 28. Jan 2009 21:39

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

_frank_ 29. Jan 2009 00:03

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 MSDN-Library durchsuchenFindWindow:
Zitat:

HWND FindWindow(
LPCTSTR lpClassName,
LPCTSTR lpWindowName
);
lpWindowName
[in] Pointer to a null-terminated string that specifies the window name (the window's title). If this parameter is NULL, all window names match.
HTH Frank

Lostriga 29. Jan 2009 14:29

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:
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;
Das Fenster wird jetzt gefunden, in den Vordergrund gesetzt und es wird,
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 22:14 Uhr.

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