• 7784阅读
  • 6回复

请问如何注册全局快捷键? [复制链接]

上一主题 下一主题
离线prout
 
只看楼主 倒序阅读 楼主  发表于: 2010-03-02
请问如何注册全局快捷键?是否有相关代码和例子呢?



在网上搜罗到:

1. 要重新实现QApplication中的winEventFilter函数,这是用来响应windows系统信息的。winEventFilter中判断 msg为WM_HOTKEY时即为用户激发了热键。 virtual bool winEventFilter(MSG *msg, long *result);

2. 用RegisterHotKey和UnregisterHotKey。 我们不知道某一个组合热键是否已经被占用,可以查看RegisterHotKey的返回值来判断,随后马上用UnregisterHotKey注销即可。

3. 自己重载的QApplication中可以加入Qt风格的Signals。捕获热键时,可以让signal传递出所按辅助键及主键的键值,其他位置的响应操作就是纯Qt风格了。

4. 要保存窗口句柄和热键ID,注销时要用到。
参考信息:  
BOOL RegisterHotKey( /* 成功时返回非零值*/      
HWND hWnd,/*响应该敏感键的窗口句柄*/       
Int id,/*该敏感键的唯一标示符*/       
UINT fsModifiers,/*该敏感键的辅助按键键值*/       
UINT vk /*该敏感键的键值*/ );
其中id在应用程序中的取值范围为0x0000到0xBFFF之间,动态链接库的取值范围为0xC000到0xFFFF之间。可以用 GlobalAddAtom函数来设置id,GlobalAddAtom的返回值在0xC000到0xFFFF范围之间,可以这样 GlobalAddAtom("myhotkey")-0xC000。
退出时要调用GlobalDeleteAtom(id)。
UnregisterHotKey(windowHandle,hotkeyid);
bool winEventFilter(MSG *msg, long *result)
{
    if(WM_HOTKEY==msg->message)
    {
       qDebug()<<"winmsg return true";
       emit hotKey(int(msg->wParam),LOWORD(msg->lParam),HIWORD(msg->lParam));
       return TRUE;
    }
   return FALSE;
}


但是具体如何添加还是不是很清楚,不知是否有人愿意详细讲解一下。

谢谢了
离线prout
只看该作者 1楼 发表于: 2010-03-02
    BOOL m_isKeyRegistered = RegisterHotKey(GetSafeHwnd(),m_nHotKeyID,MOD_ALT | MOD_CONTROL,'c');

请问在QT里如何获得窗口句柄?
离线prout
只看该作者 2楼 发表于: 2010-03-03
有人指点一下么?
离线prout
只看该作者 3楼 发表于: 2010-03-04
再问一遍
离线downstairs

只看该作者 4楼 发表于: 2011-03-31
installEventFilter?
喜爱编程的猫头鹰
离线kimtaikee

只看该作者 5楼 发表于: 2012-03-17

离线roywillow

只看该作者 6楼 发表于: 2012-03-17
获得一个窗口的句柄是用的QWidget::WinId()我记得
不过你直接参考QxtGlobalShortcut吧,那个实现的更好
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
快速回复
限100 字节
 
上一个 下一个