program Key_Bindings_test; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, Winapi.Windows, Messages, Classes; type // Class of application without window TWindowlessApplication = class private Terminated: Boolean; F7_id: Word; F6_id: Word; WIN_A: Word; procedure HandleMessage; public Handle: THandle; constructor Create; destructor Destroy; procedure Run; end; { TWindowlessApplication } constructor TWindowlessApplication.Create; begin // Allocate handle to receve a mensages Handle := CreateWindowEx(WS_EX_TOOLWINDOW, 'TWindowlessApplication', '', WS_POPUP, 0, 0, 0, 0, 0, 0, HInstance, nil); // Set the key bind for WIN+A, F6 and F7 WIN_A := GlobalAddAtom('Hotkey_WIN_A'); F6_id := GlobalAddAtom('Hotkey_F6'); F7_id := GlobalAddAtom('Hotkey_F7'); RegisterHotKey(Handle, WIN_A, MOD_WIN, ord('A')); RegisterHotKey(Handle, F6_id, 0, VK_F6); RegisterHotKey(Handle, F7_id, 0, VK_F7); // Set flag to keep running application Terminated := false; end; destructor TWindowlessApplication.Destroy; begin // Remove key bind UnRegisterHotKey(Handle, WIN_A); UnRegisterHotKey(Handle, F6_id); UnRegisterHotKey(Handle, F7_id); GlobalDeleteAtom(WIN_A); GlobalDeleteAtom(F6_id); GlobalDeleteAtom(F7_id); // Deallocate handle DeallocateHWnd(Handle); end; procedure TWindowlessApplication.Run; begin // Application loop repeat // Deal with new messages HandleMessage(); until Terminated; end; procedure TWindowlessApplication.HandleMessage; var Msg: TMsg; begin // Check for new messages if PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE) then begin // Extract it PeekMessageW(Msg, 0, 0, 0, PM_REMOVE); // Check if Msg is a HOTKEY mensage if Msg.message = WM_HOTKEY then begin // Check if the hotkey is for Win+A if Msg.wParam = WIN_A then begin // Report and terminate writeln('Win + A pressed !'#10); writeln('Bye bye'); Terminated := true; end; // Check if the hotkey is for F6 if Msg.wParam = F6_id then begin // Report and terminate writeln('F6 pressed !'); end; // Check if the hotkey is for F7 if Msg.wParam = F7_id then begin // Report and terminate writeln('F7 pressed !'); end; end; end; end; var App: TWindowlessApplication; begin App := TWindowlessApplication.Create; Writeln('Waiting user press F6 ou F7, then press WIN+A for terminate'); App.Run; App.Destroy; readln; end.