gpt4 book ai didi

c# - 使用 C# 的半非托管代码

转载 作者:太空宇宙 更新时间:2023-11-03 19:35:16 25 4
gpt4 key购买 nike

public delegate void KeyboardHookCaptureHandler(KeyboardHookEventArgs keyboardEvents);

public class KeyboardHookEventArgs : EventArgs {

private Keys _pressedKey;
private int _pressedKeyCode;

public Keys PressedKey { get { return _pressedKey; } }
public int PressedKeyCode { get { return _pressedKeyCode; } }

public KeyboardHookEventArgs(int vkCode) {
_pressedKey = (Keys)vkCode;
_pressedKeyCode = vkCode;
}
}

public class KeyboardHook {

private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);

public event KeyboardHookCaptureHandler KeyIntercepted;

private const int WH_KEYBOARD_LL = 13;
private const int WM_KEYDOWN = 0x0100;

private LowLevelKeyboardProc _proc;
private IntPtr _hookID = IntPtr.Zero;

public KeyboardHook() {
_proc = HookCallback;
_hookID = SetHook(_proc);
}
public bool UnHookKey() {
return UnhookWindowsHookEx(_hookID);
}

private IntPtr SetHook(LowLevelKeyboardProc proc) {
using (Process curProcess = Process.GetCurrentProcess())
using (ProcessModule curModule = curProcess.MainModule) {
return SetWindowsHookEx(WH_KEYBOARD_LL, proc,
GetModuleHandle(curModule.ModuleName), 0);
}
}

private IntPtr HookCallback(
int nCode, IntPtr wParam, IntPtr lParam) {
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) {
int vkCode = Marshal.ReadInt32(lParam);
KeyboardHookEventArgs keyHookArgs = new KeyboardHookEventArgs(vkCode);
KeyIntercepted(keyHookArgs);
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}


[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook,
LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);

[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);
}

所以我不知道这段代码是什么意思,尽管它是我程序的核心。它 Hook 键盘按下事件并将其发送到我的程序。谁能抽出宝贵的时间向我解释一些事情。我了解 args 类,因此您可以跳过它。我最感兴趣的是什么是 delegate,什么是 IntPtr 以及这两种方法以及它们逐行执行的操作。

感谢有时间的人

最佳答案

委托(delegate)类型 基本上指定函数或方法的签名:这是一种将函数或方法捕获为对象的方式,以便您稍后可以调用该方法。因此,委托(delegate)实例基本上是对函数或方法的引用。

IntPtr 是操作系统 native 指针——对一 block 非托管内存的不透明引用。

SetHook方法是在Windows中安装一个钩子(Hook)程序,这样系统中的每一个键盘事件都会调用这个钩子(Hook)程序。什么是钩子(Hook)程序?它是 procLowLevelKeyboardProc 委托(delegate)类型的一个实例。在这种情况下,proc 始终被设置为引用您的 HookCallback 函数。所以 SetHook 最终做的是告诉 Windows 在每次键盘事件发生时调用 HookCallback

HookCallback 正在解压缩与键盘事件关联的 native 操作系统信息,并使用解压缩的数据引发 KeyIntercepted 事件。然后它将控制传递给链中的下一个 Hook ,以防其他人想要 Hook 键盘事件。

所以这一切的最终结果是,每次键盘事件发生时,此类都会引发 KeyIntercepted 事件。此类的用户可以提供 KeyIntercepted 事件处理程序来做一些有用的事情,例如将您的银行密码发送给您选择的犯罪集团... *grin*

关于c# - 使用 C# 的半非托管代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2046079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com