gpt4 book ai didi

c# - 如何使用全局键盘钩子(Hook)和 postmessage() 模拟按键组合(例如 shift+left 用于选择文本)?

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

我正在使用全局键盘钩子(Hook) (WH_KEYBOARD_LL) 并将键发送到浏览器句柄。我能够获得用户按下的单个键,但无法获得按下的组合键(例如 shift+left 用于选择文本)。代码如下...

private IntPtr ProcessKey(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0
&& wParam == (IntPtr)WM_KEY_EVENT.WM_KEYDOWN
|| wParam == (IntPtr)WM_KEY_EVENT.WM_SYSKEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
int vkCode1 = Marshal.ReadInt32(wParam);//here I am getting runtime
//error as Attempted to read or write protected memory.
//This is often an indication that other memory is corrupt.

SafeNativeMethods.PostMessage(m_browserHandle,(uint)WM_KEY_EVENT.WM_KEYDOWN,
Convert.ToInt32((System.Windows.Forms.Keys)vkCode),
Convert.ToInt32((System.Windows.Forms.Keys)vkCode1));
}

return SafeNativeMethods.CallNextHookEx(_hookID, nCode, wParam, lParam);
}

[DllImport("user32.dll", SetLastError = true)]
public static extern bool PostMessage(IntPtr hWnd, uint msg, int wParam, int lParam);

public static class WM_KEY_EVENT
{
public static int WM_KEYDOWN = 0x0100;
public static int WM_SYSKEYDOWN = 0x0104;
public static int WM_KEYUP=0x0101;
public static int WM_SYSKEYUP=0x0105;
};

我读了一些我们可以通过使用 wParam 获得按键组合的地方,它给出了如上面代码所示的错误。请建议如何避免该错误或其他替代方法。

最佳答案

您的代码中有一些错误。您将 wParam 视为指针(因为您正在用它调用 ReadInt32),但根据 the documentation它包含窗口消息。

lParam 你应该取消引用(使用 Marshal.PtrToStructure)到 KBDLLHOOKSTRUCT , 它包含键码和修饰键状态。

而且我不明白将 vkCode 转换为 System.Windows.Fórms.Keys 值,然后再次转换回 int 有什么意义。

关于c# - 如何使用全局键盘钩子(Hook)和 postmessage() 模拟按键组合(例如 shift+left 用于选择文本)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5579000/

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