0

我正在制作一个 Qt 应用程序,并希望在更深层次上拦截按键。为此,我重写了QWidget::macEvent()函数以拦截 EventRef 参数。

对于不同的事件(即键盘事件、鼠标事件、窗口事件)EventRef等于以下值:

0×104d649f0
0×101425740
0×104d649f0
0×101485950
0×101425740
0×101485950

如何判断事件是否为键盘事件?以及如何找出按下了哪个键?我查看了事件处理文档,其中大多数都没有提到 EventRef。一些文章提到 EventRef 是如何从 Cocoa NSEvent 事件派生的 Carbon 事件。

4

2 回答 2

1

一种方法是使用+[NSEvent eventWithEventRef:]来获取NSEvent表示事件的对象。一旦你有一个NSEvent你可以使用它的方法来解释事件,例如-[NSEvent type]会告诉你它是否是一个键盘事件,和-[NSEvent characters]/-[NSEvent keyCode]会给你关于哪个键被按下的信息。

于 2013-02-02T09:08:11.433 回答
1

经过一些猜测工作,并从一本书中查看这一章,我成功地解释了 Qt 应用程序中按键的 EventRef 对象:

MyProject.pro:包括Carbon框架:

macx {
    LIBS += -framework Carbon
}

MyWidget.h : 覆盖QWidget::macEvent()

class MyWidget : public QWidget {

    ...

    private:
        #if defined(Q_OS_MAC)
            bool macEvent(EventHandlerCallRef, EventRef event);
        #endif
};

MyWidget.cpp

#if defined(Q_OS_MAC)
    #include <Carbon/Carbon.h>
#endif

...

#if defined(Q_OS_MAC)
    bool MyWidget::macEvent(EventHandlerCallRef, EventRef event) {
        uint32_t keyCode;

        switch (GetEventClass(event)) {
            case kEventClassApplication:
                qDebug() << "kEventClassApplication";
                break;
            case kEventClassCommand:
                qDebug() << "kEventClassCommand";
                break;
            case kEventClassControl:
                qDebug() << "kEventClassControl";
                break;
            case kEventClassKeyboard:
                qDebug() << "kEventClassKeyboard";

                switch(GetEventKind(event)) {
                    case kEventRawKeyDown:
                        qDebug() << "kEventRawKeyDown";

                        GetEventParameter(event, kEventParamKeyCode, typeUInt32, NULL, sizeof(keyCode), NULL, &keyCode);
                        qDebug() << "keyCode =" << keyCode;

                        break;
                    case kEventRawKeyRepeat:
                        qDebug() << "kEventRawKeyRepeat";
                        break;
                    case kEventRawKeyUp:
                        qDebug() << "kEventRawKeyUp";

                        GetEventParameter(event, kEventParamKeyCode, typeUInt32, NULL, sizeof(keyCode), NULL, &keyCode);
                        qDebug() << "keyCode =" << keyCode;

                        break;
                    case kEventRawKeyModifiersChanged:
                        qDebug() << "kEventRawKeyModifiersChanged";
                        break;
                    case kEventHotKeyPressed:
                        qDebug() << "kEventHotKeyPressed";
                        break;
                    case kEventHotKeyReleased:
                        qDebug() << "kEventHotKeyReleased";
                        break;
                }

                break;
            case kEventClassMenu:
                qDebug() << "kEventClassMenu";
                break;
            case kEventClassMouse:
                qDebug() << "kEventClassMouse";
                break;
            case kEventClassTablet:
                qDebug() << "kEventClassTablet";
                break;
            case kEventClassTextInput:
                qDebug() << "kEventClassTextInput";
                break;
            case kEventClassWindow:
                qDebug() << "kEventClassWindow";
                break;
            default:
                break;
        }

        return true;
    }
#endif
于 2013-02-02T18:41:26.950 回答