• 5483阅读
  • 2回复

关于QT4.1.x使用windows热键的问题 [复制链接]

上一主题 下一主题
离线solarisbin
 
只看楼主 倒序阅读 楼主  发表于: 2006-04-05
原来在qt 3.3.x下没有问题,可以收到windows的热键(我定义的是CTRL+ALT+h)
但是升级到 qt 4.1.x 就收不到热键消息了。。。郁闷啊
debug运行时候,显示注册热键成功、退出时候卸载热键也成功。
但是winEventFilter就是没有 WM_HOTKEY 收到。

#ifndef _IABAPP_H_
#define _IABAPP_H_
#include <Windows.h>
#include <QApplication>

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_
[ 此贴被XChinux在2006-04-05 10:42重新编辑 ]
离线solarisbin
只看该作者 1楼 发表于: 2006-05-16
找不到答案,试探着去qt那里提交为一个bug.

已经发给我一个patch. 估计会合入后续版本中。
离线gpontop

只看该作者 2楼 发表于: 2006-08-13
问题一、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的文件路径。
[ 此贴被gpontop在2006-08-13 13:00重新编辑 ]
描述:示例代码
附件: testkey.rar (4 K) 下载次数:32
快速回复
限100 字节
 
上一个 下一个