首页| 论坛| 消息

标题:关于QT4.1.x使用windows热键的问题
作者:solarisbin
日期:2006-04-05 10:02
内容:

原来在qt 3.3.x下没有问题,可以收到windows的热键(我定义的是CTRL+ALT+h)
但是升级到 qt 4.1.x 就收不到热键消息了。。。郁闷啊
debug运行时候,显示注册热键成功、退出时候卸载热键也成功。
但是winEventFilter就是没有 WM_HOTKEY 收到。
#ifndef _IABAPP_H_
#define _IABAPP_H_
#include
#include
class iabApp : public QApplication
{
Q_OBJECT
public:
iabApp ( int & argc, char ** argv )
:QApplication(argc,argv)
{
hkHide=1;
if( RegisterHotKey(0, hkHide, MOD_ALT|MOD_CONTROL, VkKeyScan('h')) )
{
qDebug("RegisterHotKey successfully.");
}else
{
qDebug("RegisterHotKey failed.");
}
}
~iabApp()
{
if( UnregisterHotKey(0, hkHide) )
{
qDebug("UnregisterHotKey successfully.");
}else
{
qDebug("UnregisterHotKey failed.");
}
}
bool winEventFilter(MSG *msg,long *result)
{
if(WM_HOTKEY==msg->message)
{
qDebug("WM_HOTKEY");
result=0;
emit hotkey();
return TRUE;
}
return FALSE;
}
signals:
void hotkey();
private:
int hkHide;
};

#endif//_IABAPP_H_


#1 [solarisbin 05-16 16:50]
找不到答案,试探着去qt那里提交为一个bug.
已经发给我一个patch. 估计会合入后续版本中。
#2 [gpontop 08-13 12:53]
问题一、RegisterHotKey/UnregisterHotKey的第一个参数必须是某个窗口的句柄,否则hotkey事件不会传到winEventFilter方法。
问题二、winEventFilter是虚函数,应该在声明该函数时加上virtual modifier。
问题三、如果与hotkey绑定的窗口如QWidget的派生类需要捕获hotkey,则需要覆盖private virtual winEvent方法。
按照上述三条修改代码,就能准确处理windows的hotkey事件。
提供一个很简单的示例希望对大家有用。提供一个很简单的示例希望对大家有用。本示例在4.1.2以上版本mingw和msvc2003及msvc2005中均编译通过,运行正常,但在msvc中需要修改Makefile.release和Makefile.debug文件,在其中的LIBS中加入User32.Lib的文件路径。

回复 发表
主题 版块