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;