![]() |
Falsche Fenster-Position wird ausgegeben!
Moinsen,
folgendes soll gemacht werden: In meinem Programm wird ein systemweiter Hotkey registriert. Beim Betätigen dieses Hotkeys soll via GetWindowRect(); die Position des derzeit aktiven Fensters ausgegeben werden. Hintergrund ist, dass ich in eine fremde Anwendung klicken muss. Genauer gesagt soll folgendes passieren: User öffnet Fremdanwendung, drückt den Hotkey. Die Position der Fremdanwendung wird ausgelesen, ein paar Koordinaten hinzuaddiert und schließlich ein Klick simuliert. Einwurf: Bei der Fremdanwendung wo ich klicken muss wird Flash eingesetzt, ich kann also nicht das Handle eines Buttons o.a. ermitteln. Auch will ich bei keinem Browsergame beschummeln falls das vermutet werden soll. Mein Problem aktuell: Unter Vista wird mir einfach eine falsche Position der Fremdanwendung ausgegeben. Selbst wenn ich das Fenster nahezu ganz nach oben links schiebe, wird mir als Koordinaten 676x420 ausgegeben anstatt vlt. 20x20 was stimmen würde. Unter XP gabs es damals dieses Problem afair nicht, dort klappte alles. Wenn ich übrigens einen Button in meinem Programm damit anklicken will, stimmt es. Ich erhalte die richtigen Koordinaten meiner Anwendung. Nur bei der Fremdanwendung erhalte ich falsche Koordinaten, keine Ahnung warum. Kann mir jemand helfen?
Delphi-Quellcode:
procedure TForm1.WMHotKey(var Msg: TWMHotKey);
var wnd: THandle; Rec: TRect; Point: TPoint; x,y: Integer; begin if Msg.HotKey = Hotkey_id then begin ShowMessage('Hotkey ausgeloest'); GetCursorPos(Point); wnd := GetForegroundWindow; GetWindowRect(wnd, Rec); showmessage(inttostr(rec.Left) + ' x ' + inttostr(rec.top)); //Ich erhalte nur falsche Koordinaten der Fremdanwendung { SetCursorPos(rec.Left+x, rec.top+y); //Das spaetere Klick-Simulieren mouse_event(MOUSEEVENTF_LEFTDOWN,rec.Left+x, rec.top+y,0,0); mouse_event(MOUSEEVENTF_LEFTUP,rec.Left+x, rec.top+y,0,0); SetCursorPos(Point.X, Point.Y);} end; end; // TShortCut für RegisterHotKey umwandeln procedure ShortCutToHotKey(HotKey: TShortCut; var Key : Word; var Modifiers: Uint); var Shift: TShiftState; begin ShortCutToKey(HotKey, Key, Shift); Modifiers := 0; if (ssShift in Shift) then Modifiers := Modifiers or MOD_SHIFT; if (ssAlt in Shift) then Modifiers := Modifiers or MOD_ALT; if (ssCtrl in Shift) then Modifiers := Modifiers or MOD_CONTROL; end; // Register Hotkey // Hotkey registrieren procedure TForm1.Button1Click(Sender: TObject); var Key : Word; Modifiers: UINT; begin ShortCutToHotKey(HotKey1.HotKey, Key, Modifiers); Hotkey_id := GlobalAddAtom('MyHotKey_1'); RegisterHotKey(Handle, Hotkey_id, Modifiers, Key); end; // Remove Hotkey // Hotkey entfernen procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin UnRegisterHotKey(Handle, Hotkey_id); GlobalDeleteAtom(Hotkey_id); end; 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; |
Re: Falsche Fenster-Position wird ausgegeben!
So wie es aussieht, war das Problem gar kein Problem. Durch die erste ShowMessage wurden jedes Mal die Koordinaten der ShowMessage geholt, auch wenn diese eigentlich nicht im Vordergrund war. :roll:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:40 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