Windows應用程式的快捷鍵設定方法
通過分析Windows API快捷鍵註冊方法,實現了對套用軟體的快捷鍵自動定義,並在工業控制領域得到了成功套用。
快捷鍵定義
查閱Windows API,函式RegisterHotKey用於設定快捷鍵。經過測試,發現通過該函式確實可以很方便地實現快捷鍵套用。
RegisterHotKey API:
BOOL RegisterHotKey(HWND hWnd,//視窗句柄Intid,//標示符UINT fsModifiers,//輔助按鍵UINT vk//鍵值);
Windows規定:快捷鍵標示符在應用程式的取值範圍在0x0000到0xBFFF之間,在動態程式庫的取值範圍為0xC000到0xFFFF之間。
為了保證快捷鍵標示符獨一性,可使用GlobalAddAtom函式設定敏感鍵的獨一標示符。需要注意:GlobalAddAtom返回值在0xC000到0xFFFF範圍之間 ,為滿足RegisterHotKey的調用要求,如果在應用程式中設定敏感鍵可利用GlobalAddAtom返回值減去0xC000。還需說明,快捷鍵的輔助按鍵包括Ctrl、Alt、Shift,對於Windows兼容鍵盤還支持Windows鍵(該鍵鍵面上有Windows標誌),其值為Mod_Win,。
快捷鍵聲明及實現
在Delphi主程式窗體中加入如下代碼:
private{ Private declarations }…QKeyid:integer;Procedure WMHotKeyHandle(var msg:Tmessage);
message WM_HotKey; //回響敏感鍵按鍵訊息…
在FormCreate事件中加入如下代碼…
QKeyid:=GlobalAddAtom(pchar(“UDFQKey”))-$C000; //Windows約定需減$C000RegisterHotKey(handle,QKeyid,MOD_CONTROL,$42); //註冊快捷鍵為Ctrl+B…
快捷鍵事件回響
一旦快捷鍵設定成功,如果相應快捷鍵被按下,不論套用軟體當前是否被激活,Windows系統都傳送給應用程式WM_HOTKEY訊息。
以下三行代碼行分別獲得三個變數值:
id:=(int) wParam;fsModifiers:=(UINT) LOWORD(lParam); //輔助按鍵uk:=(UINT) HIWORD(lParam); //鍵值
Windows系統傳送WM_HotKey訊息傳送給應用程式後,需要在程式中設定相關事件予以回響,也即WMHotKeyHandle過程,以該套用軟體獲得訊息後,彈出視窗為例,代碼如下:
Procedure TForm1.Wmhotkeyhandle(var msg:Tmessage);beginif(msg.LParamHi=$42)and(msg.lparamLo=MOD_CONTROL)thenbeginmsg.Result:=1;Application.MessageBox('截獲快捷鍵',‘’信息‘’,MB_OK);end;end;
其中msg.Result:=1說明該訊息已接收完畢。
快捷鍵釋放
套用軟體退出前,應把快捷鍵釋放掉,以供Windows系統可能為其它系統提供資源。釋放需要使用Windows API函式UnRegisterHotKey:
BOOL UNREGISTERHOTKEY(HWND HWND,//視窗句柄INT id//已經註冊的快捷鍵標示符);
因此,在FormClose事件中加入如下代碼:
…unregisterhotkey(handle,hotkeyid);DeleteAtom(HotKeyID);…
鉤子函式的應用程式快捷鍵設定
隨著現代生活節奏的加快,計算機作為工作學習的必備品,人們對其的使用也越來越追求效率。針對軟體環 境和條件,採用了通過設定鉤子函式的方法,套用鍵盤鉤子的方式實現了使用快捷鍵實現軟體的顯示隱藏,從而 實現了對應用程式的快捷操作。由此,解決了應用程式快捷操作不足、設定單一的難題,實現了應用程式的快速切換,滿足了工作學習中的需求,重要的是可以通過使用鉤子函式對應用程式進行各種操作的快捷鍵設定,極大地減少了工作量,提高了工作效率。
設定鍵盤鉤子
設定鉤子是通過API函式SetWindowsHookEx,函式聲明:
SetWindowsHookEx(idHook,lpfn,hMod,dwThread-Id),作用是將一個hook程式載入入Hook訊息鏈,其中主要的參數是idHook,其設定了具體的鉤子,這個參數可以是以下值:WH_KEYBOARD、WH_KEYBOARD_LL、WH_MOUSE、WH_MOUSE_LL等,其中參數:
·WH_KEYBOARD:一旦有鍵盤敲打訊息(鍵盤的按下、鍵盤的彈起),在這個訊息被放在應用程式的訊息佇列前,WINDOWS將會調用你的鉤子函式。鉤子函式可以改變和丟棄鍵盤敲打訊息。
·WH_MOUSE:每個滑鼠訊息在被放在應用程式的訊息佇列前,WINDOWS將會調用你的鉤子函式。鉤子函式可以改變和丟棄滑鼠訊息。
·WH_KEYBOARD_LL、WH_MOUSE_LL:最底層掛鈎,可以捕獲全部的系統按鍵信息、滑鼠信息。
因此,可以根據需要採取相應的鉤子,一般 來說使用底層鍵盤鉤子WH_KEYBOARD_LL為好。由此,鉤子的設定代碼為:
Private Const WH_KEYBOARD_LL=13&
m_Hook=SetWindowsHookEx(WH_KEYBOARD_LL,Addres-sOf KeyboardProc,_App.hInstance,0&)
其中,KeyboardProc就是設定具體控制操作的鉤子函式程式。由此,鉤子就設定完成了,每當有鍵盤訊息傳遞時,就把訊息傳遞給KeyboardProc這個鉤子函式程式進行處理。
鍵盤鉤子結構體
採用的鍵盤鉤子是WH_KEYBOARD_LL,那么它的代碼參數是HC_ACTION和 HC_NOREMOVE,其中HC_ACTION具體對應的參數值是wParam和lParam,而wParam和lParam表示的是具體的鍵盤訊息,因此,可以利用API函式CopyMemory將記憶體中的鍵盤訊息複製到鍵盤鉤子的索引結構中。
Static kbdllhks As KBDLLHOOKSTRUCT
If nCode=HC_ACTION Then
Call CopyMemory(kbdllhks,ByVal lParam,Len(kbdllhks))
其中,kbdllhks就是定義的鍵盤訊息的結構體,包含了具體的鍵盤信息,結構體的定義如下:
PrivateTypeKBDLLHOOKSTRUCT
vkCodeAsLong
scanCodeAsLong
flagsAsLong
timeAsLong
dwExtraInfoAsLong
EndType
在結構體中主要的參數是vkCode和flag,vkCode表示鍵盤的具體鍵碼,flag代表鍵是 否按下。因此,可以通過記憶體複製得到的kbdllhks,具體來說就是kbdllhks.vkCode來設定具體的快捷鍵。
快捷鍵的設定
快捷鍵說起來可以是鍵盤上的任何鍵,當然實際上也確實能夠這樣設定,但是最好是根據易用性的原則來進行具體的設定,而且要注意鍵設定的惟一性,即不要和Win-dows已有的系統鍵值衝突。因此,在採用Alt+某個鍵來進行設定。
Private Const LLKHF_ALTDOWN=&H20&
Private Const VK_a=&H41
If(kbdllhks.vkCode= VK_a)And CBool(kbdllhks.flags And
LLKHF_ALTDOWN)Then
……
End if
由此,只要按下Alt+a之後,就會回響設定的具體代碼。當然,也可以對kbdllhks.vkCode設定不同的鍵值或設定其他的組合鍵來達到要求。
應用程式句柄
設定好快捷鍵之後,就需要對應用程式的控制進行程式設計,由於設定的是全局系統的鉤子,也就是說鍵值滿足快捷鍵的設定後就會觸發,同時是對某個具體的應用程式進行控制操作,因此,需要在觸發鍵盤鉤子、滿足快捷鍵鍵值條件後,回響具體的應用程式控制操作的設計。因此,可以通過API函式GetForegroundWindow得到當前視窗也就是當前應用程式的句柄,然後再通過使用API函式GetWindowText來得到當前視窗的標題,而應用程式的標題常常是固定的,那么就可以通過比對獲得的視窗標題來
判斷當前是否是需要控制的應用程式。由此,代碼如下:
Dim s As String*255,flag As Integer,hwnd As Longhwnd=GetForegroundWindowGetWindowText hwnd,s,255flag=InStr(1,s," HX System")
其中flag就表示了當前的視窗的標題是否為“HXSystem”,通過flag的值就可以對程式進行判斷。
應用程式控制
設定的應用程式控制操作是顯示和隱藏,使用的是API函式ShowWindow,通過使用剛才獲得的視窗句柄,設定該函式的參數SW_HIDE和 SW_SHOWNOR-MAL,從而使得程式視窗隱藏或者顯示原狀。
Private Const SW_HIDE=0
Private Const SW_SHOWNORMAL=1
If gram=0then
If flag〈〉0Then
ShowWindow hwnd,SW_HIDE
gram=1
End i
Else
ShowWindow hwnd,SW_SHOWNORMAL
gram=0
End If