Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Globales Hotkey gehalten?, sowas wie WM_KEYDOWN (https://www.delphipraxis.net/120406-globales-hotkey-gehalten-sowas-wie-wm_keydown.html)

Hedge 10. Sep 2008 16:52


Globales Hotkey gehalten?, sowas wie WM_KEYDOWN
 
Hi,
ich hab ein Programm, dass mitbekommen soll, ob ein Hotkey gedrückt gehalten wird.
Wird der Hotkey gedrückt, dann wird diese Code ausgeführt:

Delphi-Quellcode:
// WM_HOTKEY Hotkey Handler
procedure TForm1.WMHotKey(var Msg: TWMHotKey);
begin
  if Msg.HotKey = Hotkey_id then
  begin
   //...
  end;
end;
Das Programm soll ein Form so lange anzeigen wie das Hotkey gedrückt gehalten wird.

und noch eine Frage.
Die Struktur von TWMHotKey sieht so aus:

Delphi-Quellcode:
TWMHotKey = packed record
  Msg: Cardinal;
  HotKey: Longint;
  Unused: Longint;
  Result: Longint;
end;
Aber nirgends ist dokumentiert was man mit Msg, Unused oder Result machen kann :/

toms 10. Sep 2008 17:22

Re: Globales Hotkey gehalten?, sowas wie WM_KEYDOWN
 
Hallo,

Du könntest z.B in einem Timer GetAsyncKeyState aufrufen und überprüfen, ob die Hotkey-Taste noch gedrückt wird.

Hedge 10. Sep 2008 17:37

Re: Globales Hotkey gehalten?, sowas wie WM_KEYDOWN
 
Zitat:

Zitat von toms
Hallo,

Du könntest z.B in einem Timer GetAsyncKeyState aufrufen und überprüfen, ob die Hotkey-Taste noch gedrückt wird.

Guter Vorschlag aber es gibt ein Problem bei GetAsyncKeyState:

The return value is zero if a window in another thread or process currently has the keyboard focus.

Mein Form soll wenn es erscheint den Fokus nicht haben weswegen ich es mit der Funktion nicht mehr bestimmen könnte.

Habe im Moment einen Workaround eingebaut:

Wenn der Hotkey gedrückt wird, dann wird ein Timmer aktiviert (800 Millisekunden).
Die Hotkey-Funktion wird wenn man die Taste gedrückt hält oft hintereinander aufgerufen und bei jedem Aufruf, wird der Timer deaktiviert und wieder aktiviert.
So erreicht der Timer nie die Ausführung seines Events da er solange der Hotkey gedrückt ist, zurückgesetzt wird.
Wenn der Hotkey jedoch für ca. 800 Millisekunden nicht berührt wurde, dann wird die Timer-Funktion abgefeuert und das Fenster wieder versteckt.

toms 10. Sep 2008 17:45

Re: Globales Hotkey gehalten?, sowas wie WM_KEYDOWN
 
Zitat:

Zitat von Hedge
Guter Vorschlag aber es gibt ein Problem bei GetAsyncKeyState:

The return value is zero if a window in another thread or process currently has the keyboard focus.

Bei mir funktioniert es auch, wenn ein Fenster eines anderen Fensters den Focus besitzt.


Zitat:

Zitat von msdn
Windows NT/2000/XP: The return value is zero for the following cases:

The current desktop is not the active desktop
The foreground thread belongs to another process and the desktop does not allow the hook or the journal record.



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