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 調用API
private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
///
/// 安裝鉤子
///
/// 鉤子類型
/// 函數指針
/// 包含鉤子函數的模塊(EXE、DLL)句柄; 一般是 HInstance; 如果是當前線程這里可以是 0
/// 關聯的線程; 可用 GetCurrentThreadId 獲取當前線程; 0 表示是系統級鉤子
/// 返回鉤子的句柄; 0 表示失敗
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
//鉤子類型 idHook 選項:
//WH_MSGFILTER?????? = -1; {線程級; 截獲用戶與控件交互的消息}
//WH_JOURNALRECORD?? = 0;??{系統級; 記錄所有消息隊列從消息隊列送出的輸入消息, 在消息從隊列中清除時發生; 可用于宏記錄}
//WH_JOURNALPLAYBACK = 1;??{系統級; 回放由 WH_JOURNALRECORD 記錄的消息, 也就是將這些消息重新送入消息隊列}
//WH_KEYBOARD????????= 2;??{系統級或線程級; 截獲鍵盤消息}
//WH_GETMESSAGE??????= 3;??{系統級或線程級; 截獲從消息隊列送出的消息}
//WH_CALLWNDPROC???? = 4;??{系統級或線程級; 截獲發送到目標窗口的消息, 在 SendMessage 調用時發生}
//WH_CBT???????????? = 5;??{系統級或線程級; 截獲系統基本消息, 譬如: 窗口的創建、激活、關閉、最大最小化、移動等等}
//WH_SYSMSGFILTER????= 6;??{系統級; 截獲系統范圍內用戶與控件交互的消息}
//WH_MOUSE?????????? = 7;??{系統級或線程級; 截獲鼠標消息}
//WH_HARDWARE????????= 8;??{系統級或線程級; 截獲非標準硬件(非鼠標、鍵盤)的消息}
//WH_DEBUG?????????? = 9;??{系統級或線程級; 在其他鉤子調用前調用, 用于調試鉤子}
//WH_SHELL?????????? = 10; {系統級或線程級; 截獲發向外殼應用程序的消息}
//WH_FOREGROUNDIDLE??= 11; {系統級或線程級; 在程序前臺線程空閑時調用}
//WH_CALLWNDPROCRET??= 12; {系統級或線程級; 截獲目標窗口處理完畢的消息, 在 SendMessage 調用后發生}
//WH_KEYBOARD_LL???? = 13; {系統級; 截獲低級鍵盤消息}
//WH_MOUSE_LL????????= 14; {系統級; 截獲低級鼠標消息}
///
/// 卸載鉤子
///
/// 鉤子的句柄
///
[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);
}
}
///
/// 處理函數
///
///
///
///
///
/// 如果返回1,則結束消息,這個消息到此為止,不再傳遞;
/// 如果返回0或調用CallNextHookEx函數則消息出了這個鉤子繼續往下傳遞,也就是傳給消息真正的接受者;
///
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
//鍵盤按下時
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);
}
}
}
}
總結
以上是生活随笔為你收集整理的vs2019键盘钩子_C#键盘按键监视的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java后期发展方向_2020年前3季度
- 下一篇: 8位数控分频器的设计_eda设计数控分频