最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

鼠標(biāo)鍵盤鉤子-組合鍵監(jiān)測

2022-10-14 18:43 作者:因心情DEQ  | 我要投稿

假設(shè)目標(biāo)窗口的句柄已取得(hwnd),然后要用PostMessage向該窗口發(fā)送按鍵消息,對于普通字符鍵,直接用WM_CHAR消息最簡單,如下:?

????PostMessage hwnd, WM_CHAR, Asc("A"), 0???' 發(fā)送一個 A 字符?

對于非普通字符按鍵,如功能鍵、方向鍵等,要用 WM_KEYDOWN、WM_KEYUP 消息,如下:?

????PostMessage hWndMsg, WM_KEYDOWN, VK_ESCAPE, &H00010001??' 模擬按下 Esc 鍵?

????PostMessage hWndMsg, WM_KEYUP, VK_ESCAPE, &HC0010001????' 模擬抬起 Esc 鍵?

以上最后一個參數(shù)(lParam)低16位(0001)表示按鍵一次,高8位00表示按下,C0表示抬起,次高8位(01)表示該鍵的掃描碼,可用 API MapVirtualKey(VirtualKey, 0)取得(注意:掃描碼在各系統(tǒng)可能會不同,在此以具體數(shù)值示例,實(shí)際應(yīng)用MapVirtualKey取得)。?

下面要講Shift/Control/Alt修飾鍵與其它按鍵的組合怎樣發(fā)送,對于Shift和Control用以下方式(用到 API keybd_event):?

????keybd_event VK_SHIFT, &H2A, 0, 0??' 模擬按下SHIFT鍵,&H2A是VK_SHIFT的掃描碼?

????PostMessage hWndMsg, WM_KEYDOWN, VK_A, &H001E0001 ' 模擬按下 A 鍵,SHIFT+A產(chǎn)生一個大寫A字符?

????PostMessage hWndMsg, WM_KEYUP, VK_A, &HC01E0001???' 模擬抬起 A 鍵?

????keybd_event VK_SHIFT, &H2A, KEYEVENTF_KEYUP, 0????' 模擬抬起 SHIFT 鍵?

以上VK_SHIFT(掃描碼2A)換成VK_CONTROL(掃描碼1D)就可以實(shí)現(xiàn)Ctrl組合鍵,VK_A(掃描碼1E)也可以換成任意功能鍵,如VK_F4(掃描碼3E)。?

對于Alt修飾鍵比較特別,它屬于系統(tǒng)按鍵,要用 WM_SYSKEYDOWN/WM_SYSKEYUP 消息,如下:?

????PostMessage hWndMsg, WM_SYSKEYDOWN, VK_F4, &H003E0001 Or &H20000000 ' 模擬按下 Alt+F4?

????PostMessage hWndMsg, WM_SYSKEYUP, VK_F4, &HC03E0001 Or &H20000000???'??模擬抬起 Alt+F4?

???????????????????????????' &H20000000 為 context code 位,置 1 表示 Alt 鍵被按下

'’捕捉快捷鍵,控制HOOK開關(guān),alt+/ 助手當(dāng)前行到最后

????????????If?wParam = 191 And?(lParam And?&H20000000) <> 0 Then

????????????????'If (lParam And &HC000000) = 0 Then ?'是否進(jìn)行ALT+F4操作

????????????????' ???MyHBHook = 1 '鉤子吃掉這個消息

????????????????'End If

????????????????MyKeyboardProc = 0

????????????????annotation注釋()

????????????????MyKeyboardProc = 1

????????????End?If

lParam這個參數(shù)我已經(jīng)知道了是個32位的 3個組合參數(shù)?

&h 00 00 00 00?

高8位 00=按下 C0=彈起?

中8位 掃描碼?

低16位 按鍵次數(shù)和擴(kuò)展功能?

你說的魔法數(shù),意思是不是編程人員因?yàn)榉浅J煜ごa, 隨便用了個“富含特定技巧”的數(shù)字?

HOOK過程中,wparam是鍵碼,lparam是一些組合信息,其中包含ALT鍵的狀態(tài).?

If wParam = 115?這里的115其實(shí)是VK_F4,聲明個常量會讓你的程序可讀性大大增加.?

而lparam的第29位就是ALT鍵是否按下,按下為1,否則為零.

‘‘’屏蔽Ctrl+Esc

???if?kbh.vkCode = Keys.Escape and?Control.ModifierKeys = Keys.Control

判斷按下CTRL鍵

?If?wParam = 76 And?(lParam And?&H80000000) = 0 And?GetKeyState(17) < 0 Then?' ctrl+L

判斷按下shift鍵 ?只能成功一個,所以先判斷功能鍵,再判斷里面的普通按鍵

?keybd_event(16, 0, 0, 0) '按下shift

?' keybd_event(16, 2, 0, 0) '抬起shift

?Public?Declare?Sub?keybd_event Lib?"user32"?Alias?"keybd_event"?(ByVal?bVk As?Integer, ByVal?bScan As?Integer, ByVal?dwFlags As?Integer, ByVal?dwExtraInfo As?Integer)

?Public?Declare?Function?PostMessage Lib?"user32"?Alias?"PostMessageA"?(ByVal?hwnd As?Integer, ByVal?wMsg As?Integer, ByVal?wParam As?Integer, lParam As?Integer) As?Integer

?PostMessage(ActiveHandle, WM_KEYDOWN, 16, MakeKeyLparam(16, WM_KEYUP)) '抬起shift

Public?Function?MakeKeyLparam(ByVal?VirtualKey As?Integer, ByVal?flag As?Integer) As?Integer

????????Dim?s As?String

????????Dim?Firstbyte As?String?'lparam參數(shù)的24-31位

????????If?flag = WM_KEYDOWN Then?'如果是按下鍵

????????????Firstbyte = "00"

????????Else

????????????Firstbyte = "C0"?'如果是釋放鍵

????????End?If

????????Dim?Scancode As?Long

????????'獲得鍵的掃描碼

????????Scancode = MapVirtualKey(VirtualKey, 0)

????????Dim?Secondbyte As?String?'lparam參數(shù)的16-23位,即虛擬鍵掃描碼

????????Secondbyte = Right("00"?& Hex(Scancode), 2)

????????s = Firstbyte & Secondbyte & "0001"?'0001為lparam參數(shù)的0-15位,即發(fā)送次數(shù)和其它擴(kuò)展信息

????????MakeKeyLparam = Val("&H"?& s)

End?Function

發(fā)送按鍵函數(shù)兩個混合用

?If?(lParam And?&H2A) = 0 And?GetKeyState(16) < 0 Then?‘判斷按下shift鍵

?Sleep(100)

???PostMessage(ActiveHandle, WM_KEYUP, 16, MakeKeyLparam(16, WM_KEYUP)) '抬起shift


鼠標(biāo)鍵盤鉤子-組合鍵監(jiān)測的評論 (共 條)

分享到微博請遵守國家法律
新竹市| 永吉县| 石棉县| 温州市| 罗山县| 青海省| 丹寨县| 沁阳市| 六枝特区| 周口市| 洞口县| 葵青区| 邯郸县| 苏尼特左旗| 佛坪县| 南漳县| 叶城县| 阿勒泰市| 东阳市| 新源县| 富阳市| 靖西县| 正宁县| 临朐县| 江门市| 宁海县| 简阳市| 闸北区| 峨眉山市| 库尔勒市| 大连市| 德清县| 报价| 黄大仙区| 鄱阳县| 洱源县| 五寨县| 安福县| 德令哈市| 丹巴县| 望谟县|