日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

vs2019键盘钩子_C#键盘按键监视

發(fā)布時(shí)間:2025/5/22 C# 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vs2019键盘钩子_C#键盘按键监视 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。