Einzelnen Beitrag anzeigen

Balu der Bär
(Gast)

n/a Beiträge
 
#1

Falsche Fenster-Position wird ausgegeben!

  Alt 12. Sep 2009, 19:28
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;
  Mit Zitat antworten Zitat