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 Klick auf aktives Fenster landet woanders (https://www.delphipraxis.net/122585-klick-auf-aktives-fenster-landet-woanders.html)

The Riddler 18. Okt 2008 23:33


Klick auf aktives Fenster landet woanders
 
Ganz einfach soll auf dem aktiven Fenster ein Button angeklickt werden (der Button liegt bei 2,2 also links oben). Mein Code funktioniert soweit, dass Handle stimmt und auch in Rec stehen die richtigen Werte des aktiven Fensters. Nur leider, landet der Klick nicht auf dem Button, sondern bei Koordinaten 3,3 auf dem gesamten Bildschirm. Nicht mal in der Nähe des aktiven Fensters also. Was mach ich falsch?

Delphi-Quellcode:
function GetSysFocus : HWND;
var
  ThreadID, CurrThrId: cardinal;
begin
  Result := 0;
  ThreadID := GetWindowThreadProcessID(GetForegroundWindow, nil);
  CurrThrId := GetCurrentThreadId;
  if ThreadID <> CurrThrId then
  begin
    if AttachThreadInput(ThreadID, CurrThrId, true) then
    begin
      Result := GetFocus;
      AttachThreadInput(ThreadID, CurrThrId, false);
    end;
  end
  else
    Result := GetFocus;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  wnd: THandle;
  Rec: TRect;
begin
  wnd := GetSysFocus;
  GetWindowRect(wnd, Rec);
  showmessage(inttostr(rec.Left));

mouse_event(MOUSEEVENTF_MOVE Or MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_ABSOLUTE,Rec.Left+3,Rec.Top+3,0,0);
mouse_event(MOUSEEVENTF_MOVE Or MOUSEEVENTF_LEFTUP Or MOUSEEVENTF_ABSOLUTE,Rec.Left+3,Rec.Top+3,0,0);
end;

alleinherrscher 18. Okt 2008 23:56

Re: Klick auf aktives Fenster landet woanders
 
Welchen Wert spuckt denn deine MessageBox bei Rec.Left aus?

The Riddler 18. Okt 2008 23:58

Re: Klick auf aktives Fenster landet woanders
 
Hat sich erledigt.

Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var
  wnd: THandle;
  Rec: TRect;
begin
  wnd := GetForegroundWindow;
  GetWindowRect(wnd, Rec);
  showmessage(inttostr(rec.Left+3) + ' x ' + inttostr(rec.top+3));
  SetCursorPos(rec.Left+30, rec.top+30);

  mouse_event(MOUSEEVENTF_LEFTDOWN,rec.Left+3, rec.top+3,0,0);
  mouse_event(MOUSEEVENTF_LEFTUP,rec.Left+3, rec.top+3,0,0);
end;
Zitat:

Da ist das Problem: If MOUSEEVENTF_ABSOLUTE value is specified, dx and dy contain normalized absolute coordinates between 0 and 65,535. The event procedure maps these coordinates onto the display surface. Coordinate (0,0) maps onto the upper-left corner of the display surface, (65535,65535) maps onto the lower-right corner.

alleinherrscher 18. Okt 2008 23:59

Re: Klick auf aktives Fenster landet woanders
 
Hehe, fein, dann mal gute Nacht! :zwinker:

The Riddler 19. Okt 2008 00:04

Re: Klick auf aktives Fenster landet woanders
 
Danke trotzdem!

Ich wäre nicht der Riddler, wenn ich nicht als Dank ein Rätsel für dich hätte!

Zitat:

Ich habe Milliarden Augen, und lebe doch in der Dunkelheit. Ich habe Milliarden Ohren, doch nur zwei Lappen. Ich habe keine Muskeln, bin aber trotzdem der Herrscher über zwei halbkugeln! Was bin ich?

toms 19. Okt 2008 04:31

Re: Klick auf aktives Fenster landet woanders
 
Hallo, besser ist es, mittels PostMessage() einen Klick zu senden.

The Riddler 19. Okt 2008 08:20

Re: Klick auf aktives Fenster landet woanders
 
Hallo, warum?

toms 19. Okt 2008 08:42

Re: Klick auf aktives Fenster landet woanders
 
Zitat:

Zitat von The Riddler
Hallo, warum?

Da man mit PostMessage() eine Nachricht direkt an ein Handle senden kann.
Das ist eine sicherere Methode, da nicht auf die Position des Control geachtet werden muss.
(verschiedene Bildschirmauflösungen könnten auch Schwierigkeiten bereiten)

Ein Vorteil ist auch, dass sich das Fenster mit dem Control nicht unbedingt im Vordergrund befinden muss.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:04 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