![]() |
Hot-Keys systemweit/global setzen und verwenden
Liste der Anhänge anzeigen (Anzahl: 1)
Beitrag befindet sich jetzt
![]() Huhu! Mal eine aufbereitete Komponente zu diesem Thread hier: ![]() Die Komponente handled Hotkeys und gibt sie via event ans fenster zurück. Mit der Funktion "RegisterGlobalHKey()" kann für das Programm ein Hotkey erzeugt werden. Die Parameter sind dabei: Param fsModifiers: MOD_ALT ALT muß gedrückt sein MOD_CONTROL CTRL muß gedrückt sein MOD_SHIFT SHIFT muß gedrückt sein MOD_WIN WINDOWS-Taste muß gedrückt sein Mehrere Modifiers werden mit "or" verknüpft. Und Param vk: Die Virtuellen Key Konstanten aus der Unit Windows... also VK_F9 etc. Hier nochmal der quellcode der unit:
Delphi-Quellcode:
//******************************************************************************
//* Datei: GlobalHotKey.Pas //* Klasse: TGlobalHotKey //* Autors: xxx ( DP: Sunlight7 ) //* Christopher Henschel ( DP: Relicted ) //* Zweck: Komponente zum setzen Globaler Hotkeys für eine //* Anwendung //* //* -------------------------------------------------------------------------- //* $Date: May 29 2007 10:16:36 $ //* $Modtime: $ //* $Revision: 1.0 $ //* $Workfile: GlobalHotKey.pas $ //****************************************************************************** unit GlobalHotKey; interface uses Classes, Controls, Messages, Windows; // Speicherrecord für die einzelnen Hotkeys. type THotKey = record HotKeyVK : cardinal; HotKeyModifiers : cardinal; HotKeyID : integer; end; // Event für das Formular type TGlobalHotKeyPressed = procedure( fsModifiers, vk : Cardinal ) of object; // Klasse zum Handlen der HotKey-Events type TGlobalHotKey = class(TComponent) private // Counter für die HotKeyIDs nHotKeyID : integer; // Speicherarray für die HotKeys arHotKeys : array of THotKey; // Member für das OnHotKeyPressed Event m_pmnfHotKeyPressed : TGlobalHotKeyPressed; // Handle FWindowHandle : HWND; // Funktion zum setzen des OnHotKeyPressed Events. procedure SetHotKeyPressed( const Event : TGlobalHotKeyPressed ); protected procedure WMHotKey(var Message:TMessage); message WM_HOTKEY; public // Funktion zum setzen eines neuen globalen Hotkeys. // vk: Virtueller Key, auf welchen reagiert werden soll. // z.B. : "VK_F9" für die F9 Taste. // fsModifiers: // MOD_ALT ALT muß gedrückt sein // MOD_CONTROL CTRL muß gedrückt sein // MOD_SHIFT SHIFT muß gedrückt sein // MOD_WIN WINDOWS-Taste muß gedrückt sein // Mehrere Modifiers werden mit "or" verknüpft. function RegisterGlobalHKey( fsModifiers, vk : Cardinal ) : boolean; // Destructor und Constructor... destructor Destroy; override; constructor Create(AOwner: TComponent); override; // Property für das Handle property Handle : HWND read FWindowHandle; published // Property zum setzen des OnHotKeyPressed-Events property OnHotKeyPressed : TGlobalHotKeyPressed read m_pmnfHotKeyPressed write SetHotKeyPressed; end; // Prozedur zum registrieren der Komponente. procedure Register; implementation //****************************************************************************** //* Behandelt die Registrierung der Komponente in der Reiterkarte "Zusätzlich" //****************************************************************************** procedure Register; begin RegisterComponents('Zusätzlich', [TGlobalHotKey]); end; //****************************************************************************** //* Behandelt die Registrierung eines Hotkeys //****************************************************************************** function TGlobalHotKey.RegisterGlobalHKey(fsModifiers, vk : Cardinal) : boolean; var bSet : boolean; begin result := false; try // Hotkey registrieren bSet := RegisterHotKey( Self.Handle, nHotKeyID, fsModifiers, vk ); if bSet then begin // Speicherplatz für einen neuen Hotkey erweitern SetLength( arHotKeys, Length(arHotKeys)+1 ); // Hotkey Eintrag with arHotKeys[ Length(arHotKeys)-1 ] do begin HotKeyVK := vk; HotKeyModifiers := fsModifiers; HotKeyID := nHotKeyID; end; // Result Setzen result := true; // Die HotKeyId hochzählen... Inc(nHotKeyID); end; except //... end; end; //****************************************************************************** //* Behandelt das Event, welches ausgelöst wird wenn einer der Hotkeys gedrückt //* wurde und sendet dieses, falls vorhanden an das Formular weiter //****************************************************************************** procedure TGlobalHotKey.WMHotKey(var Message:TMessage); begin try if Assigned( m_pmnfHotKeyPressed ) and ( Message.Msg = WM_HotKey ) then m_pmnfHotKeyPressed( Message.LParamLo, Message.LParamHi ); Message.Result := DefWindowProc(FWindowHandle, Message.Msg, Message.wParam, Message.lParam); except //... end; end; //****************************************************************************** //* Constructor //****************************************************************************** constructor TGlobalHotKey.Create(AOwner: TComponent); begin inherited; // Initialisieren nHotKeyID := 1; FWindowHandle := AllocateHWND(WMHotKey); end; //****************************************************************************** //* Destructor //****************************************************************************** destructor TGlobalHotKey.Destroy; var i : integer; begin // Hotkeys wieder unregistrieren for i := 0 to Length( arHotKeys ) - 1 do UnRegisterHotKey(Self.Handle, arHotKeys[ i ].HotKeyID); DeallocateHWnd(FWindowHandle); inherited; end; //****************************************************************************** //* Behandlung der Set Methode für das HotKeyEvent //****************************************************************************** procedure TGlobalHotKey.SetHotKeyPressed(const Event: TGlobalHotKeyPressed); begin m_pmnfHotKeyPressed := Event; end; end. Für Kritik bin ich natürlich offen :-) Viel Spass damit. Gruß Reli [edit=CalganX] Mfg, CalganX[/edit] |
Re: Hot-Keys systemweit/global setzen und verwenden
Hallo, bin ich blind oder ist FKeys vollkommen überflüssig, da ungenutzt?
|
Re: Hot-Keys systemweit/global setzen und verwenden
hups ja... ist noch ein fragment.. wollte eigentlich noch nen editor in die propertys reinbauen um direkt im objektinspektor die keys zu definieren..
*mal editen* gruß reli |
Re: Hot-Keys systemweit/global setzen und verwenden
Liste der Anhänge anzeigen (Anzahl: 1)
Moin!
Da mir Relicted das zugeschickt hat, da er meinen Code stibitst hat (wie er selbst sagte :lol:), hab ich mal drüber geguckt, den Fehler, der entsteht wenn mann die Komponente in mehreren Instanzen verwendet ausgebessert und eine Unregister Funktion hinzugefügt. Dazu auch einen UserInfo Parameter zum leichteren Handeln des Events. Als Anhang die Komponente, und ein Beispielprojekt. Grüße, Sunlight7 Edit: Die überarbeitete Version läuft ab Delphi 2.0, die ursprüngliche ab D4 (glaub ich) |
Re: Hot-Keys systemweit/global setzen und verwenden
na das klappt ja gut mit uns wir sollten ein extreme-programming team bilden :-)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:38 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