1. 程式人生 > 實用技巧 >Delphi 全域性熱鍵KeyPress 和 熱鍵 API(RegisterHotKey、UnRegisterHotKey、GlobalAddAtom、GlobalDeleteAtom、GlobalFindAtom)

Delphi 全域性熱鍵KeyPress 和 熱鍵 API(RegisterHotKey、UnRegisterHotKey、GlobalAddAtom、GlobalDeleteAtom、GlobalFindAtom)

Delphi 全域性熱鍵KeyPress 和 熱鍵 API(RegisterHotKey、UnRegisterHotKey、GlobalAddAtom、GlobalDeleteAtom、GlobalFindAtom)

1、熱鍵按作用分為:全域性、區域性、系統級

  • 全域性和區域性的:主窗體可設定KeyPress屬性監控 ;
    • self.KeyPreview:=true;
  • 系統級:需要用到win API函式:RegisterHotKey、UnRegisterHotKey、GlobalAddAtom、GlobalDeleteAtom、GlobalFindAtom


2、熱鍵API(RegisterHotKey、UnRegisterHotKey、GlobalAddAtom、GlobalDeleteAtom、GlobalFindAtom)


RegisterHotKey 原型:

BOOL RegisterHotKey( 
    HWND hWnd, //響應該熱鍵的視窗控制代碼 
    Int id,    //該熱鍵的唯一標識 
    UINT fsModifiers, //該熱鍵的輔助按鍵 
    UINT vk   //該熱鍵的鍵值 
); 

fsModifiers 輔助按鍵的取值:

  • MOD_ALT //Either ALT key must be held down.
  • MOD_CONTROL //Either CTRL key must be held down.
  • MOD_NOREPEAT //Changes the hotkey behavior so that the keyboard auto-repeat does not yield multiple hotkey notifications. Windows Vista: This flag is not supported.
  • MOD_SHIFT //Either SHIFT key must be held down.
  • MOD_WIN //Either WINDOWS key was held down.

GlobalAddAtom 原型: 

ATOM GlobalAddAtom( 
  LPCTSTR lpString //增加一個字串到全域性原子列表中,並返回一個唯一標識值。
); 

GlobalFindAtom 原型:

ATOM GlobalFindAtom(
    LPCTSTR lpString  // 在全域性原子列表中查詢是否存在指定字串
);  

返回值: 如果在全域性原子中存在要查詢的字串,則返回此字串對應的ID值。沒有找到則返回0。 


3、Delphi 示例:

HotKeyId: Integer;   //宣告一個全域性變數
HotKeyId := GlobalAddAtom('MyHotKey')   //取得唯一標識ID
RegisterHotKey(Handle, hotkeyid, MOD_ALT, VK_F9);    //註冊ALT+F9熱鍵
RegisterHotKey(Handle, hotkeyid, 0, VK_F9);    //註冊F9熱鍵
UnRegisterHotKey(handle, HotKeyId);    //登出HotKey, 釋放資源。
GlobalDeleteAtom('MyHotKey');  //

  

procedure HotKeyDown(var Msg: Tmessage); message WM_HOTKEY;   //宣告 

procedure TForm1.HotKeyDown(var Msg: Tmessage); 
begin 
  if (Msg.LparamLo = MOD_ALT) AND (Msg.LParamHi = VK_F9 then) // 假設熱鍵為 ALT+F9 
  begin 
     //事件
  end; 
end; 

 

4、注意事項:

  當其他程式先註冊了系統級的熱鍵,則再註冊熱鍵無效。 


建立時間:2020.07.28  更新時間: