vs2019键盘钩子_C#键盘按键监视
using System;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
///
/// 獲取鍵盤按鍵
///
public class InterceptKeys
{
private const int WH_KEYBOARD_LL = 13; //全局鍵盤鉤子
private const int WM_KEYDOWN = 0x0100; //鍵盤按下
//private const int WM_KEYUP = 0x0101; //鍵盤抬起
private static LowLevelKeyboardProc _proc = HookCallback;
private static IntPtr _hookID = IntPtr.Zero;
#region 調(diào)用API
private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
///
/// 安裝鉤子
///
/// 鉤子類型
/// 函數(shù)指針
/// 包含鉤子函數(shù)的模塊(EXE、DLL)句柄; 一般是 HInstance; 如果是當(dāng)前線程這里可以是 0
/// 關(guān)聯(lián)的線程; 可用 GetCurrentThreadId 獲取當(dāng)前線程; 0 表示是系統(tǒng)級(jí)鉤子
/// 返回鉤子的句柄; 0 表示失敗
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
//鉤子類型 idHook 選項(xiàng):
//WH_MSGFILTER?????? = -1; {線程級(jí); 截獲用戶與控件交互的消息}
//WH_JOURNALRECORD?? = 0;??{系統(tǒng)級(jí); 記錄所有消息隊(duì)列從消息隊(duì)列送出的輸入消息, 在消息從隊(duì)列中清除時(shí)發(fā)生; 可用于宏記錄}
//WH_JOURNALPLAYBACK = 1;??{系統(tǒng)級(jí); 回放由 WH_JOURNALRECORD 記錄的消息, 也就是將這些消息重新送入消息隊(duì)列}
//WH_KEYBOARD????????= 2;??{系統(tǒng)級(jí)或線程級(jí); 截獲鍵盤消息}
//WH_GETMESSAGE??????= 3;??{系統(tǒng)級(jí)或線程級(jí); 截獲從消息隊(duì)列送出的消息}
//WH_CALLWNDPROC???? = 4;??{系統(tǒng)級(jí)或線程級(jí); 截獲發(fā)送到目標(biāo)窗口的消息, 在 SendMessage 調(diào)用時(shí)發(fā)生}
//WH_CBT???????????? = 5;??{系統(tǒng)級(jí)或線程級(jí); 截獲系統(tǒng)基本消息, 譬如: 窗口的創(chuàng)建、激活、關(guān)閉、最大最小化、移動(dòng)等等}
//WH_SYSMSGFILTER????= 6;??{系統(tǒng)級(jí); 截獲系統(tǒng)范圍內(nèi)用戶與控件交互的消息}
//WH_MOUSE?????????? = 7;??{系統(tǒng)級(jí)或線程級(jí); 截獲鼠標(biāo)消息}
//WH_HARDWARE????????= 8;??{系統(tǒng)級(jí)或線程級(jí); 截獲非標(biāo)準(zhǔn)硬件(非鼠標(biāo)、鍵盤)的消息}
//WH_DEBUG?????????? = 9;??{系統(tǒng)級(jí)或線程級(jí); 在其他鉤子調(diào)用前調(diào)用, 用于調(diào)試鉤子}
//WH_SHELL?????????? = 10; {系統(tǒng)級(jí)或線程級(jí); 截獲發(fā)向外殼應(yīng)用程序的消息}
//WH_FOREGROUNDIDLE??= 11; {系統(tǒng)級(jí)或線程級(jí); 在程序前臺(tái)線程空閑時(shí)調(diào)用}
//WH_CALLWNDPROCRET??= 12; {系統(tǒng)級(jí)或線程級(jí); 截獲目標(biāo)窗口處理完畢的消息, 在 SendMessage 調(diào)用后發(fā)生}
//WH_KEYBOARD_LL???? = 13; {系統(tǒng)級(jí); 截獲低級(jí)鍵盤消息}
//WH_MOUSE_LL????????= 14; {系統(tǒng)級(jí); 截獲低級(jí)鼠標(biāo)消息}
///
/// 卸載鉤子
///
/// 鉤子的句柄
///
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);
#endregion
///
/// 安裝鉤子
///
public static void SetHook()
{
using (Process curProcess = Process.GetCurrentProcess())
using (ProcessModule curModule = curProcess.MainModule)
{
_hookID = SetWindowsHookEx(WH_KEYBOARD_LL, _proc, GetModuleHandle(curModule.ModuleName), 0);
}
}
///
/// 處理函數(shù)
///
///
///
///
///
/// 如果返回1,則結(jié)束消息,這個(gè)消息到此為止,不再傳遞;
/// 如果返回0或調(diào)用CallNextHookEx函數(shù)則消息出了這個(gè)鉤子繼續(xù)往下傳遞,也就是傳給消息真正的接受者;
///
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
//鍵盤按下時(shí)
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
Keys key = (Keys)vkCode;
//記錄到日志
File.AppendAllText(@"C:\hot.txt", DateTime.Now.ToString("HH:mm:ss") + ": " + key.ToString() + "\r\n");
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
///
/// 卸載鉤子
///
public static void UnHook()
{
if (_hookID != IntPtr.Zero)
{
UnhookWindowsHookEx(_hookID);
}
}
}
}
總結(jié)
以上是生活随笔為你收集整理的vs2019键盘钩子_C#键盘按键监视的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java后期发展方向_2020年前3季度
- 下一篇: 8位数控分频器的设计_eda设计数控分频