![]() |
Hot-Keys systemweit setzen und verwenden
Hallo!
Heiße Tasten - Aus einer Frage heraus habe ich festgestellt, das es hier noch kein Beispiel für Systemweite Hot-Key's gibt. Also wird's Zeit dafür :wink:
Delphi-Quellcode:
Aber nicht das Ihr jetzt alle Programme mit Sinnlosen Hot-Key's zupflanzt :wink:
///////////////////////////////////////////
// Beispiel: Shift F1 als Hot-Key setzen // /////////////////////////////////////////// // Infos zu den Paramater // 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 unit HotKeyForm; interface uses ... type TForm1 = class(TForm) procedure FormCreate(Sender:TObject); private { Private-Deklarationen } HotKeySet:Boolean; protected { Protected-Deklarationen } procedure WMHotKey(var Message:TMessage); message WM_HOTKEY; ... end; var Form1: TForm1; implementation {$*.dfm} const HotKeyID=1; procedure TForm1.FormCreate(Sender:TObject); begin HotKeySet:=RegisterHotKey(Self.Handle, HotKeyID, MOD_SHIFT, VK_F1); If not HotKeySet then ShowMessage('Hot-Key konnte nicht gesetzt werden:'#13+SysErrorMessage(GetLastError)); end; procedure TForm1.FormDestroy(Sender:TObject); begin // Nur UnregisterHotKey aufrufen wenn HotKeySet True ist! If HotKeySet then // <- Und den Fehler hat keiner gesehen :) Da war ein not drin UnRegisterHotKey(Self.Handle, HotKeyID); end; procedure TForm1.WMHotKey(var Message:TMessage); begin If Message.wParam=HotKeyID then ShowMessage('Hot-Key "Shift F1" funktioniert!'); end; Stichwort für Suche: Globale Hotkeys [edit=CalganX]Titel, Klassifizierung. Mfg, CalganX[/edit] [edit=SirThornberry]Stichwort auf Wunsch hinzugefügt - Mfg, SirThornberry[/edit] |
Re: Systemweite Hot-Key's einrichten
Eine kleine Anmerkung noch:
Zitat:
Delphi-Quellcode:
Wenn keine Umschalttaste gedrückt werden muss, einfach 0 einsetzen:
RegisterHotKey(Self.Handle, HotKeyID, MOD_SHIFT or MOD_ALT, VK_F1);
Delphi-Quellcode:
RegisterHotKey(Self.Handle, HotKeyID, 0, VK_F1);
Dann hab ich nochmal eine Frage zur HotKeyID: Kann die Registrierung eines HotKeys auch fehlschlagen, wenn ein anderes Programm bereits einen HotKey mit dieser Zahl (HotKeyID) festgelegt hat, oder kann die Funktion nur Fehlschlagen, wenn die Tastenkombination bereits vergeben ist? |
Re: Hot-Keys systemweit setzen und verwenden
Die Registrierung schlägt fehl, sobald irgendein Programm oder Windows den Hot-Key bereits verwendet.
|
Re: Hot-Keys systemweit setzen und verwenden
Liste der Anhänge anzeigen (Anzahl: 1)
Relicted und Sunlight7 haben den Code noch ein wenig verbessert.
Dazu hat Relicted folgende Unit geschrieben: Zitat:
Delphi-Quellcode:
Im Anhang zu diesem Beitrag befindet sich darüber hinaus die Klasse als VCL-Komponente und ein Beispielprojekt, erstellt von Sunlight7.
//******************************************************************************
//* 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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:10 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