我写了一个程序,
   用RegisterHotKey(this->m_hWnd,ID_SubMoveDown,NULL,VK_DOWN); 注册热键.
   结束的时候UnregisterHotKey(this->m_hWnd,ID_SubMoveDown);
   
   这样,我的程序用起来是正常的,但是只要我的程序在运行,向下键VK_DOWN在其他程序里就不起作用了.   有没有办法让我的快捷键只在我的程序里起作用?不影响其他程序的快捷键?
     请高手帮助!

解决方案 »

  1.   

    热键冲突了...为你的程序设置一个键盘HOOK,拦截按键做响应的处理,也可以满足你的要求..
      

  2.   

    这个不应该使用RegisterHotKey,而是在WM_KEYDOWN中判断
      

  3.   

    我注册了很多快捷键,包括 ctrl+c  Ctrl+v Shift+t 等等.
    如果使用hook 拦截键盘消息.   我怎么判断这个消息是哪个按键发出的?组合键又怎么判断?另外,我的程序是用单文档转为ActiveX控件的,它没有消息泵.所以不能直接响应WM_KEYDOWN消息.
      

  4.   

    去看下Hook的基础知识 WH_KEYBOARD_LL
      

  5.   

    谢谢各位的热心解答.不好意思,我发现是可以响应WM_KEYDOWN的.
    现在的问题是:怎么在void CCoreSymbolView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)中判断组合键?
      

  6.   

    比如你要用ctrl+c
    那么先判断nChar是不是'C',这里nChar是虚拟键码,对于数字和大写字母的键就是对应的字符ascii码
    如果是,则使用GetAsynKeyState判断ctrl有没有被按下
      

  7.   

    打错了,是GetAsyncKeyStateif(GetAsyncKeyState(VK_CONTROL)&32768)control被按下
      

  8.   

    switch (nChar)
    {
       case 'c':
    {
    if(GetAsyncKeyState(VK_LCONTROL))
    {
    MessageBox("sd");
    }
    break;
    }
    case 'C':
    {

    if(GetAsyncKeyState(VK_LCONTROL))
    {
    MessageBox("sd");
    }
    break;
    }
    问题依然存在! 这样的话,我按Ctrl+C 起效果,按Ctrl+SHIFT+C 才会有效果!
    而且,如果我写成下面的代码:
    switch (nChar)
    {
       case 'c':
    {
    if(GetAsyncKeyState(VK_LSHIFT))
    {
    MessageBox("sd");
    }
    break;
    }
    case 'C':
    {

    if(GetAsyncKeyState(VK_LSHIFT))
    {
    MessageBox("sd");
    }
    break;
    }然后,问题更奇怪了.我使用的是搜狗拼音输入法,shift键是切换中英文的.如果当前输入法是英文状态,按SHIFT+C 没效果,如果是中文,直接按C,就会弹出messagebox.
    天哪!到底是怎么回事?  大侠帮我分析分析吧!
    是不是因为我用的是ActiveX控件,所以对消息的解析是不标准的?
    是不是需要自己解析一下消息什么的?
      

  9.   

    你不能这样if(GetAsyncKeyState(VK_LCONTROL))
    要if(GetAsyncKeyState(VK_CONTROL)&32768)
      

  10.   

    大侠啊!我改成你说的这个还是不行!我在case 'C':
    {if(GetAsyncKeyState(VK_LSHIFT))
    {
    MessageBox("sd");
    }
    break;
    }
    里设了一个断点,如果我单按c,他会进断点.如果同时按CTRL+C ,就进不去断点了!
    也就是说这个时候的nchar已经不是'C'了.还请大虾指点迷津!
      

  11.   

    那你就这样
    if((GetAsyncKeyState(VK_CONTROL)&32768)&&(GetAsyncKeyState(0x43)&32768))
    这是判断ctrl+c的
      

  12.   

    深深感谢Lactoferrin的热心帮助!
    我最终知道问题何在了,因为我用的是ActiveX控件,调试时使用的是控件调试器.
    Ctrl+C 被控件调试器捕获了,所以进不去断点.按照你的方法,捕获其他的快捷键就是可以的.
    谢谢你!