C 全域性鉤子和區域性鉤子記錄

2022-03-01 12:18:21 字數 3519 閱讀 2627

源自:

最近碰巧要使用鍵盤鉤子,於是在網上搜尋了一番,發現大多數部落格的文章都是雷同的,根本就沒有講清楚全域性鉤子和區域性鉤子的區別,於是特開一貼,講全域性鉤子和區域性鉤子捋一捋。也供後面的人學習。

因為大部分應用都應該採用區域性鉤子,所以我這兒使用的是區域性鉤子,而全域性鉤子的例子網上到處都是。

大部分網上參考文章都只是展示了全域性鉤子的寫法,而執行緒鉤子的寫法和介紹相對少一些,特別是關鍵語句上如果定義的不正確是沒有任何效果的,在自己反覆嘗試後決定留下乙個正確的版本分享出來

**如下

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...