[英]How to simulate combination of keys(such as shift+left for selecting text) using global keyboard hook and postmessage()?
我正在使用全局键盘挂钩(WH_KEYBOARD_LL),并将键发送到浏览器句柄。 我可以让用户按下一个键,但是不能按下组合键(例如,Shift +向左键选择文本)。代码如下...
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),但是根据文档,它包含窗口消息。
lParam应该取消引用(使用Marshal.PtrToStructure)到KBDLLHOOKSTRUCT ,它包含键代码和修饰键状态。
而且我看不到将vkCode强制转换为System.Windows.Fórms.Keys值,然后再次重新转换为int的意义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.