AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Mausklick an ein bestimmtes Handle senden.
Thema durchsuchen
Ansicht
Themen-Optionen

Mausklick an ein bestimmtes Handle senden.

Ein Thema von Lostriga · begonnen am 27. Jan 2009 · letzter Beitrag vom 29. Jan 2009
Antwort Antwort
Lostriga

Registriert seit: 14. Jun 2008
28 Beiträge
 
#1

Mausklick an ein bestimmtes Handle senden.

  Alt 27. Jan 2009, 00:47
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
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.580 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Mausklick an ein bestimmtes Handle senden.

  Alt 27. Jan 2009, 01:53
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
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#3

Re: Mausklick an ein bestimmtes Handle senden.

  Alt 27. Jan 2009, 06:14
Hallo

Stimmt denn das Fenster Handle?
Mache doch eine Überprüfung auf <> 0.
Thomas
  Mit Zitat antworten Zitat
Lostriga

Registriert seit: 14. Jun 2008
28 Beiträge
 
#4

Re: Mausklick an ein bestimmtes Handle senden.

  Alt 27. Jan 2009, 19:29
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.


Mit freundlichem Gruß

Lostriga
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#5

Re: Mausklick an ein bestimmtes Handle senden.

  Alt 27. Jan 2009, 20:06
Dann ermittle das richtige Handle (z.B mit meinem WinSpy. Siehe Signatur)
Thomas
  Mit Zitat antworten Zitat
Lostriga

Registriert seit: 14. Jun 2008
28 Beiträge
 
#6

Re: Mausklick an ein bestimmtes Handle senden.

  Alt 28. Jan 2009, 00:15
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
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#7

Re: Mausklick an ein bestimmtes Handle senden.

  Alt 28. Jan 2009, 02:27
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
  Mit Zitat antworten Zitat
Lostriga

Registriert seit: 14. Jun 2008
28 Beiträge
 
#8

Re: Mausklick an ein bestimmtes Handle senden.

  Alt 28. Jan 2009, 22:39
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
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#9

Re: Mausklick an ein bestimmtes Handle senden.

  Alt 29. Jan 2009, 01:03
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
  Mit Zitat antworten Zitat
Lostriga

Registriert seit: 14. Jun 2008
28 Beiträge
 
#10

Re: Mausklick an ein bestimmtes Handle senden.

  Alt 29. Jan 2009, 15:29
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:41 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