按下F5这个窗口会跳到所有窗口的前端,如何截下这个F5消息,并实现前端显示

解决方案 »

  1.   

    用RegisterHotKey注册热键,并
    在消息WM_HOTKEY中进行响应,用函数SetForegroundWindow(hwnd); 把窗口置最前端。
      

  2.   

    原理: RegistreHotKey是全局的一个注册热键的函数,用其可以向系统申请注册一个热键,无需借助于加载快捷键资源的方法。

    函数原型:BOOL RegisterHotKey(HWND hWnd,int id,UINT fsModifiers,UINT vk);

       参数介绍: hWnd:接收热键产生WM_HOTKEY消息的窗口句柄。若该参数NULL,传递给调用线程的WM_HOTKEY消息必须在消息循环中中进行处理。    id:定义热键的标识符。调用线程中的其他热键不能使用同样的标识符。应用功能程序必须定义一个0X0000-0xBFFF范围的值。一个共享的动态链接库(DLL)必须定义一个范围为0xC000-0xFFFF的值(GlobalAddAtom函数返回该范围)。为了避免与其他动态链接库定义的热键冲突,一个DLL必须使用GlobalAddAtom函数获得热键的标识符。    fsModifoers:定义为了产生WM_HOTKEY消息而必须与由nVirtKey参数定义的键一起按下的键。该参数可以是如下值的组合:   MOD_ALT:按下的可以是任一Alt键。MOD_CONTROL:按下的可以是任一Ctrl键。   MOD_SHIFT:按下的可以是任一Shift键。   MOD_WIN:按下的可以是任一Windows按键。这些键可以用Microsoft Windows日志记录下来。   MOD_NOREPEAT:更改热键行为,以便键盘自动重复不会产生多个热键通知。   vk:定义热键的虚拟键码。    返回值:若函数调用成功,返回一个非0值。若函数调用失败,则返回值为0。若要获得更多的错误信息,可以调用GetLastError函数。

    当程序结束的时候,要卸载该热键。 卸载热键用到的函数是:UnregisterHotKey ,该函数功能:该函数释放调用线程先前登记的热键。   

    函数原型:BOOL UnregisterHotKey(HWND hWnd,int id);  

    参数:   

    hWnd:与被释放的热键相关的窗口句柄。若热键不与窗口相关,则该参数为NULL。   

    id:定义被释放的热键的标识符。   

    返回值:若函数调用成功,返回值不为0。若函数调用失败,返回值为0。若要获得更多的错误信息,可以调用GetLastError函数。 


      注意到,如果向系统注册一个热键”alt+a”,要做的就是 fsModifoers设为MOD_ALT, vk 设置为VK_A(VK_A是自定义的一个宏,虚拟码为:65,也可以借助mfc的,不用定义).用法如下: BOOL m_isKeyRegistered;  //是否注册该热键成功

    m_nHotKeyIDA=0;   //这个值是自己设置的, 由于是全局的,其他程序如果用到该原理来实现注册热键,很可能会冲突,所以取值的时候,要留意。

    m_isKeyRegistered = ::RegisterHotKey(GetSafeHwnd(),m_nHotKeyIDA,MOD_ALT,VK_D);

    ASSERT(m_isKeyRegistered != FALSE);   //DEBUG版本

    上面的代码放到CTest3Dlg::OnInitDialog里面即可。

    卸载热键则是将卸载代码放到OnCancel,OnOK,函数里面。


    注册之后,系统怎样响应快捷呢?

    手动添加:  ON_MESSAGE(WM_HOTKEY,OnHotKey)  , 


    //热键处理函数

      LONG CTest3Dlg::OnHotKey(WPARAM wParam,LPARAM lParam)
      {  


     if(wParam==m_nHotKeyIDA)

    {
     AfxMessageBox(_T("A功能"));
    ………………..
    }
      return 0;

    }        然后SetForeGroundWindow(你 的窗口句柄)