AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Falsche Fenster-Position wird ausgegeben!
Thema durchsuchen
Ansicht
Themen-Optionen

Falsche Fenster-Position wird ausgegeben!

Ein Thema von Balu der Bär · begonnen am 12. Sep 2009 · letzter Beitrag vom 13. Sep 2009
Antwort Antwort
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
Balu der Bär
(Gast)

n/a Beiträge
 
#2

Re: Falsche Fenster-Position wird ausgegeben!

  Alt 13. Sep 2009, 09:05
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.
  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 14:29 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