代码之家  ›  专栏  ›  技术社区  ›  Eox

C++QT QML:禁用整个程序上的特定键盘键

  •  0
  • Eox  · 技术社区  · 3 年前

    我有一个使用QML的C++程序。Workplace希望我阻止人们在其上使用alt+tab、alt+ctrl+del或alt+F4,以防止用户绕过标准程序退出按钮返回桌面 (我可能不得不取消更多的快捷方式,但到目前为止,我正专注于这三个)

    我能看到自己实现这一点的最简单方法是禁用一些特定的键盘键,比如上面列出的所有快捷键中几乎都使用的“alt”键。但我找不到任何方法来拦截和阻止整个程序的alt键按下,尽管我确实找到了一些拦截“ctrl”键的方法:

    class MyWindowsEventFilter : public QAbstractNativeEventFilter
    {
        public:
            virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long *) Q_DECL_OVERRIDE
            {
                if (eventType == "windows_generic_MSG") 
                {   //This intercepts the control key, but what I actually want is intercepting the "alt key
                    MSG* ev = static_cast<MSG *>(message);
                    if (ev->message == WM_KEYDOWN && GetAsyncKeyState(VK_CONTROL)) {
                        qDebug() << "Captured CONTROL+" << ev->wParam;
                        return true;
                    }
                }
                return false;
            }
    };
    

    我想看看我是否可以重新利用该函数来拦截“alt”键,但我似乎找不到任何针对该特定键的“VK”定义。除此之外,我似乎无法将“installEventFilter”函数与QGuiApplication对象上的MyWindowsEventFilter类一起使用,因为此函数需要QObject*对象,而不是从QAbstractNativeEventFilter扩展而来的对象。

    有没有办法防止在我的整个程序中按下alt键?

    0 回复  |  直到 3 年前
        1
  •  0
  •   Jürgen Lutz    3 年前

    使用标准QT事件过滤器并将其注册到应用程序中。你可以处理任何按键 用于您的应用程序

    class KeyInterceptor: public QObject
    {
        Q_OBJECT
        protected:
          bool eventFilter(QObject *obj, QEvent *event);
    };
    
    bool KeyInterceptor::eventFilter(QObject *obj, QEvent *event) {
        if (event->type() == QEvent::KeyPress) {
            QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
    
            if (keyEvent->modifiers() == Qt::ALT) {
                qDebug("press ALT...do something");
                return true;
            }
        }
    
        // normal handling
        return QObject::eventFilter(obj, event);
    }
    

    并且在主程序中:

    app.installEventFilter(new KeyInterceptor());
    

    但是你 无法处理其他键事件处理程序 (像操作系统一样)无论如何都要处理ALT-TAB序列。