日期:2014-05-18  浏览次数:20879 次

全局Hook怎么模拟ctrl?
在全局Hook的KeyboardHookProc方法是这样写的!
private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
{
  // 侦听键盘事件
  if ((nCode >= 0) && (KeyDownEvent != null || KeyUpEvent != null || KeyPressEvent != null))
  {

  KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam,
  typeof(KeyboardHookStruct));
  if (KeyDownEvent != null && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN))
  {
  Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;
  KeyEventArgs e = new KeyEventArgs(keyData);
  KeyDownEvent(this, e);
  }
  }
}
在form中引用全局钩子,当按下ctrl键时,要把背景色变为红色
private void hook_KeyDownEvent(object sender, KeyEventArgs e)
{
  if (e.Control)
  {
  this.BackColor = Color.Red;
  }
}

现在在调试的时候,按下ctrl键,e.Control的值是为FALSE。这是怎么回事啊?
我要怎么才能用全局钩子模拟出ctrl键?
麻烦说下。
3Q!

------解决方案--------------------
参考

http://topic.csdn.net/u/20081025/14/f8aad5aa-b219-4350-beb7-bde249d3c471.html
------解决方案--------------------
往消息队列送个ctrl的键值,模拟ctrl按下。。。
------解决方案--------------------
C# code
[DllImport("user32")]
        public static extern void keybd_event(
                     byte bVk,
                     byte bScan,
                     uint dwFlags,
                     uint dwExtraInfo
                                              );//模拟键盘消息
byte VK_CONTROL=17;
byte VK_C=67;
//下面四句话就是CTRL+C
keybd_event(VK_CONTROL, 0, 0, 0);
                        keybd_event(VK_C, 0, 0, 0);
                        keybd_event(VK_C, 0, 0x2, 0);
                        keybd_event(VK_CONTROL, 0, 0x2, 0);

------解决方案--------------------
楼主表达能力有问题

你问的是“模拟Ctrl”,也就是发送击键,那么7楼已经给你解决了

但是听你表达,你好象是想“拦截Ctrl”,也就是如果按下Ctrl,收到一个通知,而不是主动去触发一个Ctrl键


哎。。。。
------解决方案--------------------
if (KeyDownEvent != null && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN)) 

Keys keyData = (Keys)MyKeyboardHookStruct.vkCode; 
KeyEventArgs e = new KeyEventArgs(keyData); 
KeyDownEvent(this, e); 

这段代码执行没有?如果执行了,直接从vkCode来判断Control是否按下
------解决方案--------------------
是不是被PreviewKeyDown吞掉了
------解决方案--------------------
是不是被PreviewKeyDown吞掉了