注册 登录
编程论坛 C++ Builder

應用程式敏感鍵的實現

Knocker 发布于 2006-03-27 12:52, 1360 次点击

----在一個應用程式內部功能表、部件都可以設置敏感鍵。如在功能表中一般用alt+f進
入“文件”之類的子功能表。另外我們在桌面上設置的快捷方式裏的快捷鍵,無論你任何
時候按下你所設置的快捷鍵就會?動相應的應用程式。在多個正在運行的應用程式中如
何利用一個按鍵動作迅速地回到你所需要的應用程式呢?這就需要利用敏感鍵
(hotkey)的技術來實現。本文利用delphi3.0開發工具來闡述該技術在應用程式的實
現方法。

一、敏感鍵的設置

----在windowsapi中有一個函數registerhotkey用於設置敏感鍵,它的調用方式如下:

boolregisterhotkey(
hwndhwnd,回應該敏感鍵的窗口控制碼
intid,該敏感鍵的唯一標示符
uintfsmodifiers,該敏感鍵的輔助按鍵
uintvk該敏感鍵的鍵值
);
----其中敏感鍵的唯一標示符在window中規定應用程式的取值範圍?0x0000到0xbfff之
間,動態連結程式庫的取值範圍?0xc000到0xffff之間。?了保證其唯一性建議使用
globaladdatom函數來設置敏感鍵的唯一標示符。需要注意的是globaladdatom還回的值
是在0xc000到0xffff範圍之間,?滿足registerhotkey的調用要求,如果是在應用程式
中設置敏感鍵可以利用globaladdatom還回值減去0xc000。
----敏感鍵的輔助按鍵包括mod_ctrl、mod_alt、mod_shift,對於windows相容鍵盤還
支援windows鍵,即其鍵面上有windows標誌的那個鍵,其值?mod_win。

----在delphi中建立一個“newapplication”,在tform1中的private段中加入如下
代碼

private
{privatedeclarations}
hotkeyid:integer;
procedurewmhotkeyhandle(varmsg:tmessage);
messagewm_hotkey;回應敏感鍵按鍵消息
在formcreate事件中加入如下代碼

hotkeyid:=globaladdatom(pchar
(“userdefinehotkey”))-$c000;
減去$c000是?了保證取值範圍的限制
registerhotkey(handle,hotkeyid,
mod_controlormod_altt,$41);
敏感鍵?ctrl+alt+a

二、敏感鍵的回應
----一旦敏感鍵設置成功,在程式應用過程中如果有相應敏感鍵被按下,windows系統都會給
你的應用程式發送一個消息wm_hotkey,不管你的應用程式是否?當前活動的。其中wm_hotkey
消息的格式?:

idhotkey=(int)wparam;
該參數在設置系統級的敏感鍵有用,一般不予使用
fumodifiers=(uint)loword(lparam);
敏感鍵的輔助按鍵
uvirtkey=(uint)hiword(lparam);
敏感鍵的鍵值
----因?windows系統只是把一個wm_hotkey的消息發送給應用程式,要完成具體的事情需要一
個消息處理程式,也就是上面private段裏的
procedurewmhotkeyhandle(varmsg:tmessage);messagewm_hotkey;過程,它的代碼
如下(這裏只是簡單地把視窗最前面顯示)
proceduretform1.wmhotkeyhandle
(varmsg:tmessage);
begin
if(msg.lparamhi=$41)and
(msg.lparamlo=mod_controlormod_alt)then
begin
msg.result:=1;該消息已經處理
application.bringtofront;
把視窗最前面顯示
end;
end;
三、敏感鍵的釋放
----在應用程式退出來之前應當把你所設置的敏感鍵釋放掉,以釋放其所佔有的系統資源,這裏
需要調用兩個windowsapi函數unregisterhotkey,它的調用格式如下:

boolunregisterhotkey(
hwndhwnd,與敏感鍵關聯的窗口控制碼
intid敏感鍵的標示符
);
也就是說只要在formclose事件中加入如下代碼

unregisterhotkey(handle,hotkeyid);
deleteatom(hotkeyid);

----到這裏?止,你應當對敏感鍵技術有了全面的瞭解,以上的例子相當簡單同時也沒有提供必
要的調用成功檢測,可以根據具體情況加以完善,希望對你的開發過程會有所幫助.

0 回复
1