使用钩子技术实现QT中的全局热键

本文探讨了如何在QT中实现全局热键,以确保即使窗口失去焦点也能响应键盘事件。作者尝试了事件监控和子窗体派生的方法,但最终选择了使用钩子技术。代码示例展示了局部钩子如何拦截并处理键盘消息,通过这种方式可以防止开始菜单在按下Win键时弹出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    QT中的窗体只有获得焦点的情况下,才会响应按键或鼠标事件(MFC的窗体是否也是如此?)。但是在实际开发过程中,我们常常需要的是即使某些窗体处于失去焦点状态时,也能响应相应的键盘或者鼠标事件。那么,应该如何实现呢?

    笔者在遇到这种情况时,首先考虑的还是使用事件监控的方式,但笔者在实际使用中发现,该种方式不是太适合。(主窗体需要监控所有的子窗体并且在监控QAxWidget时情况也很特殊,笔者并未深入研究。)。其次考虑的是将所有的子窗体派生,在派生中传递所有的按键或者鼠标事件至父窗体。很明显,该种方式也不合适。想想为什么?后来,网上有人说用全局热键能够实现,笔者对全局热键没有研究。用了钩子技术来实现的。(windows操作系统)

   代码如下.

.h文件


typedef void (MainWidget::*FUNC)(int);
struct  ITEM_FUNC
{
    int  code;
    FUNC pFun;
    int  param;
};
class MainWidget : public QWidget
{
    Q_OBJECT

public:
    explicit MainWidget(QWidget *parent,QString serverIP,int httpPort,int tcpPort,int udpPort);
    ~MainWidget();
private:
    void test_fuc(int);
    void select_main_card(int){};
    void select_next_card(int){}; 
public:
    //注册钩子
    void register_key_hook();
    //释放钩子
    vo
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值