源自:
最近碰巧要使用鍵盤鉤子,於是在網上搜尋了一番,發現大多數部落格的文章都是雷同的,根本就沒有講清楚全域性鉤子和區域性鉤子的區別,於是特開一貼,講全域性鉤子和區域性鉤子捋一捋。也供後面的人學習。
因為大部分應用都應該採用區域性鉤子,所以我這兒使用的是區域性鉤子,而全域性鉤子的例子網上到處都是。
大部分網上參考文章都只是展示了全域性鉤子的寫法,而執行緒鉤子的寫法和介紹相對少一些,特別是關鍵語句上如果定義的不正確是沒有任何效果的,在自己反覆嘗試後決定留下乙個正確的版本分享出來
**如下
using
system;
using
system.collections.generic;
using
system.linq;
using
system.text;
using
system.reflection;
using
system.runtime.interopservices;
using
system.windows.forms;
namespace
assisttoolset.util
public
enum hc_code : int
//////
安裝鉤子
/// [dllimport("
user32.dll
", setlasterror = true, callingconvention =callingconvention.stdcall)]
public
static
extern intptr setwindowshookex(wh_code idhook, hookproc lpfn, intptr pinstance, uint
threadid);
//////
解除安裝鉤子
/// [dllimport("
user32.dll
", callingconvention =callingconvention.stdcall)]
public
static
extern
bool
unhookwindowshookex(intptr phookhandle);
//////
傳遞鉤子
/// [dllimport("
user32.dll
", callingconvention =callingconvention.stdcall)]
public
static
extern
intcallnexthookex(intptr phookhandle, wh_code ncodem, int32 wparam, intptr lparam);
//////
獲取全部按鍵狀態
/// ///
///非0表示成功
[dllimport("
user32.dll")]
public
static
extern
int getkeyboardstate(byte
pbkeystate);
//////
獲取程式集模組的控制代碼
/// ///
///[dllimport("
kernel32.dll
", charset = charset.auto, setlasterror = true
)]
public
static
extern intptr getmodulehandle(string
lpmodulename);
//////
獲取當前程序中的當前執行緒id
/// ///
[dllimport("
kernel32.dll
", charset =charset.auto)]
public
static
extern
uint
getcurrentthreadid();
#region 私有變數
private
byte mkeystate = new
byte[256
];
private keys mkeydata = keys.none; //
專門用於判斷按鍵的狀態
//////
鍵盤鉤子控制代碼
/// private intptr mketboardhook =intptr.zero;
//////
鍵盤鉤子委託例項
/// private
hookproc mkeyboardhookprocedure;
#endregion
#region 鍵盤事件
public
event
keyeventhandler onkeydown;
public
event
keyeventhandler onkeyup;
#endregion
//////
建構函式
/// public
hook()
~hook()
//////
鍵盤鉤子處理函式
/// private
intkeyboardhookproc(wh_code ncode, int32 wparam, intptr lparam)
else
if (lparam.toint32() < 0 && this.onkeyup != null
)
}if(shortcutmanagement.s_bhotkeyused)
return callnexthookex(this
.mketboardhook, ncode, wparam, lparam);
}//////
安裝鉤子
/// ///
public
bool
installhook()
}return
true
; }
//////
解除安裝鉤子
/// ///
true表示成功
public
bool
uninstallhook()
return
result;}}
}原文:https:
view code
通過這次認知,意識到,以後如果要做這些接觸相關的api的時候,我們應該盡量去查官方文件,而不是一開始就是檢視別人的部落格。應該以官方文件為主。一定要記住鍵盤鉤子事件。
32位和64位的系統不一樣。
全域性鉤子和區域性鉤子
蒐集了許多的資料,也做了各種嘗試,但是還不是很明白具體的分類.根據目前所掌握的總結一下 區域性鉤子 注意事項 第乙個引數是wh keyboard類似的區域性鉤子引數,第二個是 函式,可以再當前dll exe 中也可以在其他的dll中 第三個引數可設為0就可以,可能是忽略這個引數了吧.第四個引數是當前...
區域性鉤子和和全域性鉤子
區域性鉤子的使用 1在自定義的form類中寫 clean 欄位名 2 取出欄位的真正值,name self.cleaned data.get name 3判斷自己的規則,如果判斷失敗,丟擲validationerror 4 如果通過,return name 區域性鉤子 def clean name ...
c 全域性鍵盤鉤子
using system using system.collections.generic using system.text using system.windows.forms using system.runtime.interopservices using system.diagnosti...