Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Global hotkeys and nativeEvent() is not working in Qt6
QtWS25 Last Chance

Global hotkeys and nativeEvent() is not working in Qt6

Scheduled Pinned Locked Moved Solved General and Desktop
3 Posts 2 Posters 780 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • W Offline
    W Offline
    wlivengood
    wrote on 5 Apr 2023, 22:21 last edited by
    #1

    I've made a small application (as seen on several examples) that registers a global hotkey with WINAPI's RegisterHotKey() function and handles the event in QWidget's reimplemented nativeEvent().

    The application behaves as I expect when compiled with Qt versions 5.12.3 and 5.15.2; however, when I compile with 6.2.4 or 6.5.0 the nativeEvent() function is never called.

    Is there some additional settings that I need to utilize when using Qt6?

    GlobalHotKeyTest.h

    #pragma once
    
    #include <QtWidgets/QMainWindow>
    #include "ui_GlobalHotkeyTest.h"
    
    #define HOTKEY_CTRL_ALT_S_ID    1
    
    class GlobalHotkeyTest : public QMainWindow
    {
        Q_OBJECT
    
    public:
        GlobalHotkeyTest(QWidget *parent = nullptr);
        ~GlobalHotkeyTest();
    
    protected:
        // The method for processing native events from the OS in Qt
        bool nativeEvent( const QByteArray& eventType, void* message, long* result );
    
    private:
        Ui::GlobalHotkeyTestClass ui;
    };
    

    GlobalHotkeyTest.cpp

    #include "GlobalHotkeyTest.h"
    #include <windows.h>
    #include <QMessageBox>
    
    GlobalHotkeyTest::GlobalHotkeyTest(QWidget *parent)
        : QMainWindow(parent)
    {
        ui.setupUi(this);
    
    /*----------------------------------------------------------------
    Windows Specific
    Register Ctrl+Alt+S as a hotkey combo.
    This registers the combo as a system-wide shortcut for this
    application so you can stop jiggling even when the application
    is not in the foreground.
    ----------------------------------------------------------------*/
        bool result = RegisterHotKey(
            (HWND)this->window()->winId(),
            HOTKEY_CTRL_ALT_S_ID,
            MOD_CONTROL | MOD_ALT,
            Qt::Key_S );
    
        if ( !result ) {
            DWORD error = GetLastError();
            LPSTR messageBuffer = nullptr;
    
            //Ask Win32 to give us the string version of that message ID.
            //The parameters we pass in, tell Win32 to create the buffer that holds the message for us (because we don't yet know how long the message string will be).
            size_t size = FormatMessageA( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
                                          NULL, error, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), (LPSTR)&messageBuffer, 0, NULL );
    
            //Copy the error message into a std::string.
            std::string message( messageBuffer, size );
    
            //Free the Win32's string's buffer.
            LocalFree( messageBuffer );
    
            QMessageBox::critical( this, "Failed to register hot key", QString::fromStdString( message ) );
        };
    }
    
    GlobalHotkeyTest::~GlobalHotkeyTest()
    {
        UnregisterHotKey( (HWND)this->window()->winId(), HOTKEY_CTRL_ALT_S_ID );
    }
    
    bool GlobalHotkeyTest::nativeEvent( const QByteArray & eventType, void* message, long* result )
    {
    /*----------------------------------------------------------------
     Windows Specific
     Intercept the hotkey message from the windows event filter.
     //
     ----------------------------------------------------------------*/
        MSG* msg = static_cast<MSG*>( message );
        if ( msg->message == WM_HOTKEY ) {
            LPARAM combo = Qt::Key_S << 16 | MOD_CONTROL | MOD_ALT;
            bool result = msg->lParam & combo;
    
            QMessageBox::information(this,"Hotkey detected","The hotkey was detected");
            return( true );
    
        }
    
        return( false );
    }
    
    1 Reply Last reply
    0
    • H Offline
      H Offline
      hskoglund
      wrote on 5 Apr 2023, 22:51 last edited by
      #2

      Hi, the function declaration of nativeEvent() has changed slightly in Qt6 so it will work again if you change:

      // Qt5 flavor
      bool nativeEvent( const QByteArray& eventType, void* message, long* result );
      

      to

      // Qt6 flavor
      bool nativeEvent(const QByteArray& eventType, void* message, qintptr* result);
      

      P.S Actually why not add the override spec. so you're prepared for Qt7 (if that had been in there in Qt5 you would got a compiler error today :-)

      // preparing for Qt7 or later
      bool nativeEvent(const QByteArray& eventType, void* message, qintptr* result) override;
      
      W 1 Reply Last reply 6 Apr 2023, 17:23
      2
      • W wlivengood has marked this topic as solved on 6 Apr 2023, 17:18
      • H hskoglund
        5 Apr 2023, 22:51

        Hi, the function declaration of nativeEvent() has changed slightly in Qt6 so it will work again if you change:

        // Qt5 flavor
        bool nativeEvent( const QByteArray& eventType, void* message, long* result );
        

        to

        // Qt6 flavor
        bool nativeEvent(const QByteArray& eventType, void* message, qintptr* result);
        

        P.S Actually why not add the override spec. so you're prepared for Qt7 (if that had been in there in Qt5 you would got a compiler error today :-)

        // preparing for Qt7 or later
        bool nativeEvent(const QByteArray& eventType, void* message, qintptr* result) override;
        
        W Offline
        W Offline
        wlivengood
        wrote on 6 Apr 2023, 17:23 last edited by
        #3

        @hskoglund Thanks for the pointing that out. I guess I did not pay close enough attention to the new declaration.

        1 Reply Last reply
        0

        2/3

        5 Apr 2023, 22:51

        • Login

        • Login or register to search.
        2 out of 3
        • First post
          2/3
          Last post
        0
        • Categories
        • Recent
        • Tags
        • Popular
        • Users
        • Groups
        • Search
        • Get Qt Extensions
        • Unsolved