winform鍵盤全域性與執行緒Hook

2022-07-19 07:39:13 字數 2201 閱讀 7325

///宣告鍵盤鉤子的封送結構型別

///[structlayout(layoutkind.sequential)]

public

class

keyboardhookstruct

//

使用windows api函式代替獲取當前例項的函式,防止鉤子失效

[dllimport("

kernel32.dll")]

public

static

extern intptr getmodulehandle(string

lpmodulename);

//安裝鉤子

[dllimport("

user32.dll

", charset = charset.auto, callingconvention =callingconvention.stdcall)]

public

static

extern

int setwindowshookex(int idhook, hookproc lpfn, intptr hinstance, int

threadid);

//下乙個鉤子

[dllimport("

user32.dll

", charset = charset.auto, callingconvention =callingconvention.stdcall)]

public

static

extern

int callnexthookex(int idhook, int

ncode, int32 wparam, intptr lparam);

//解除安裝鉤子

[dllimport("

user32.dll

", charset = charset.auto, callingconvention =callingconvention.stdcall)]

public

static

extern

bool unhookwindowshookex(int

idhook);

//取得當前執行緒編號(執行緒鉤子需要用到)

[dllimport("

kernel32.dll")]

static

extern

int getcurrentthreadid();

private

int keyboardhookproc(int

ncode, int32 wparam, intptr lparam)

}return

callnexthookex(hkeyboardhook, ncode, wparam, lparam);

}

private

int keyboardhookproc(int

ncode, int32 wparam, intptr lparam)

}return

callnexthookex(hkeyboardhook, ncode, wparam, lparam);

}

執行緒hook keyboardhookproc函式的各個引數意義如下:

ncode    訊息的型別,分hc_action和hc_noremove

wparam    按鍵的虛擬鍵碼

lparam    按鍵的相關引數資訊,包括重複時間、按鍵的狀態(按下或彈起)等

全域性hook keyboardhookproc函式的各個引數意義如下:

ncode    訊息的型別,有hc_action

wparam    按鍵的狀態(按下或彈起)wm_keydown、wm_keyup、wm_syskeydown、wm_syskeyup

lparam    指向keyboardhookstruct結構的指標,該結構包含了按鍵的詳細資訊。

public

void

start()

}}

public

void

start()

}}

注:idhook 鉤子型別,即確定鉤子監聽何種訊息

執行緒鉤子監聽鍵盤訊息應設為2,全域性鉤子監聽鍵盤訊息應設為13

執行緒鉤子監聽滑鼠訊息應設為7,全域性鉤子監聽滑鼠訊息應設為14

全域性鍵盤鉤子失效與WebRTC的關係分析

1.背景 使用qt cef做了乙個客戶端,並在客戶端中註冊了全域性鍵盤鉤子,本來一切都工作正常,鍵盤鉤子也正常,但是我發現當我在cef中載入了執行webrtc功能的頁面時,鍵盤鉤子盡然失效了,不過切換到其他的桌面程式的時候,發現這個鍵盤鉤子還是存在的,起作用的。2.分析 通過上面的現象開始排查,we...

WPF與WinForm對比多執行緒程式設計優化是關鍵

it168技術 很多人問過我這樣乙個問題 wpf和以前的winform有什麼區別?我之前的回答一直是 沒什麼區別,僅僅是表示層用xaml封了層皮,使得windows看起來更炫了。今天 確切的說是昨天 我終於發現了我膚淺。首先我要澄清一下,wpf較之winform的先進之處不止一點點。對於wpf,很多...

多執行緒全域性函式與訊息機制的結合

這裡我用vc 6.0建立了乙個名為muti tread的對話方塊程式。在muti threaddlg.h header file 中新增 generated message map functions afx msg declare message map 在 muti threaddlg.cpp ...