在全局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!

解决方案 »

  1.   

    参考http://topic.csdn.net/u/20081025/14/f8aad5aa-b219-4350-beb7-bde249d3c471.html
      

  2.   

    往消息队列送个ctrl的键值,模拟ctrl按下
      

  3.   

    请问这个怎么搞啊?
    那在form中要怎么判断呢?
    能讲细点吗?
    谢谢了!
      

  4.   

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

  5.   

    谢谢楼上的,不过我要用全局钩子来截获ctrl+c,
    我用的Hook只能勾住像A,B,CZ这些键,不能勾住ctrl,shift,alt这些键。
    怎么弄的?
      

  6.   

    楼主表达能力有问题你问的是“模拟Ctrl”,也就是发送击键,那么7楼已经给你解决了但是听你表达,你好象是想“拦截Ctrl”,也就是如果按下Ctrl,收到一个通知,而不是主动去触发一个Ctrl键
    哎。
      

  7.   

    是我表达得不清楚,是要拦截,不是主动触发ctrl键。
    还没有拦截到,谁能说下啊?
      

  8.   

       if (KeyDownEvent != null && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN)) 
            { 
                Keys keyData = (Keys)MyKeyboardHookStruct.vkCode; 
                KeyEventArgs e = new KeyEventArgs(keyData); 
                KeyDownEvent(this, e); 
            } 
    这段代码执行没有?如果执行了,直接从vkCode来判断Control是否按下
      

  9.   


    这个代码执行了啊,if (e.Control)不就是判断有没有control键按下没有啊,可是这些系统键我都无法判断出。
      

  10.   

    用if(e.KeyCode ==Keys.LControlKey||e.KeyCode==Keys.RControlKey)能判断ctrl键按下了。
    但是if(e.control)确不能,e.control的值总是false。
    这样就不能判断是不是ctrl+c了,
    if((e.KeyCode ==Keys.LControlKey||e.KeyCode==Keys.RControlKey)&&e.keycode==keys.C) 这样子肯定不行
    只能用if(e.control&&e.keycode==keys.C)才能判断是ctrl+c吧。
    为什么按下ctrl键了,e.control的值是false呢?