實現監聽的**如下
private
keyeventhandler mykeyeventhandeler =
null
;//按鍵鉤子
private
keyboardhook k_hook =
newkeyboardhook()
;private
void
hook_keydown
(object sender,
keyeventargs e)
public
void
startlisten()
public
void
stoplisten()
}
現在呼叫一下startlisten();程式就會監聽鍵盤了,不想監聽了就呼叫stoplisten();
將引用新增到類中(這裡需要注意:如果用vs建立的不是windows窗體程式,則需要引用一下system.windows.forms.dll)
using system;
using system.collections.generic;
using system.text;
using system.runtime.interopservices;
using system.windows.forms;
using system.reflection;
將以下**替換到乙個新類中
class
keyboardhook
//使用此功能,安裝了乙個鉤子
[dllimport
("user32.dll"
, charset = charset.auto, callingconvention = callingconvention.stdcall)
]public
static
extern
intsetwindowshookex
(int idhook,
hookproc lpfn,
intptr hinstance,
int threadid)
;//呼叫此函式解除安裝鉤子
[dllimport
("user32.dll"
, charset = charset.auto, callingconvention = callingconvention.stdcall)
]public
static
extern
bool
unhookwindowshookex
(int idhook)
;//使用此功能,通過資訊鉤子繼續下乙個鉤子
[dllimport
("user32.dll"
, charset = charset.auto, callingconvention = callingconvention.stdcall)
]public
static
extern
intcallnexthookex
(int idhook,
int ncode,
int32 wparam,
intptr lparam)
;// 取得當前執行緒編號(執行緒鉤子需要用到)
[dllimport
("kernel32.dll")]
static
extern
intgetcurrentthreadid()
;//使用windows api函式代替獲取當前例項的函式,防止鉤子失效
[dllimport
("kernel32.dll")]
public
static
extern
intptr
getmodulehandle
(string name)
;public
void
start()
}}public
void
stop()
if(!(retkeyboard)
)throw
newexception
("解除安裝鉤子失敗!");
}//toascii職能的轉換指定的虛擬鍵碼和鍵盤狀態的相應字元或字元
[dllimport
("user32")]
public
static
extern
inttoascii
(int uvirtkey,
//[in] 指定虛擬關鍵**進行翻譯。
int uscancode,
// [in] 指定的硬體掃瞄碼的關鍵須翻譯成英文。高階位的這個值設定的關鍵,如果是(不壓)
byte
lpbkeystate,
// [in] 指標,以256位元組陣列,包含當前鍵盤的狀態。每個元素(位元組)的陣列包含狀態的乙個關鍵。如果高階位的位元組是一套,關鍵是**(按下)。在低位元,如果設定表明,關鍵是對切換。在此功能,只有肘位的caps lock鍵是相關的。在切換狀態的num個鎖和滾動鎖定鍵被忽略。
byte
lpwtranskey,
// [out] 指標的緩衝區收到翻譯字元或字元。
int fustate)
;// [in] specifies whether a menu is active. this parameter must be 1 if a menu is active, or 0 otherwise.
//獲取按鍵的狀態
[dllimport
("user32")]
public
static
extern
intgetkeyboardstate
(byte
pbkeystate);[
dllimport
("user32.dll"
, charset = charset.auto, callingconvention = callingconvention.stdcall)
]private
static
extern
short
getkeystate
(int vkey)
;private
const
int wm_keydown =
0x100
;//keydown
private
const
int wm_keyup =
0x101
;//keyup
private
const
int wm_syskeydown =
0x104
;//syskeydown
private
const
int wm_syskeyup =
0x105
;//syskeyup
private
intkeyboardhookproc
(int ncode,
int32 wparam,
intptr lparam)
//鍵盤按下
if(keypressevent !=
null
&& wparam == wm_keydown)
}// 鍵盤抬起
if(keyupevent !=
null
&&(wparam == wm_keyup || wparam == wm_syskeyup))}
//如果返回1,則結束訊息,這個訊息到此為止,不再傳遞。
//如果返回0或呼叫callnexthookex函式則訊息出了這個鉤子繼續往下傳遞,也就是傳給訊息真正的接受者
return
callnexthookex
(hkeyboardhook, ncode, wparam, lparam);}
~keyboardhook()
}
C 全域性鍵盤監聽
using system using system.collections.generic using system.text using system.runtime.interopservices using system.windows.forms using system.reflectio...
C 全域性鍵盤監聽(Hook)的使用
一.為什麼需要全域性鍵盤監聽?在某些情況下應用程式需要實現快捷鍵執行特定功能,例如大家熟知的qq截圖功能ctrl alt a快捷鍵,只要qq程式在執行 無論是擁有焦點還是處於後台執行狀態 都可以按下快捷鍵使用此功能 二.怎樣才能實現全域性鍵盤監聽?這裡需要用到windows api,原始碼如下 可以...
c 全域性鍵盤鉤子
using system using system.collections.generic using system.text using system.windows.forms using system.runtime.interopservices using system.diagnosti...