2014-09-04 104 views

回答

2

不能使用Qt,因爲它是操作系統特定的做到這一點。但是,您可以在Windows中使用GetSystemMenuAppendMenu函數修改菜單,然後捕獲單擊項目的事件。

下面是一個簡單的例子here。它附加了一個分隔符和一個關於項目的菜單:

#include "windows.h" 

// IDM_ABOUTBOX must be in the system command range 
//  (IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX) 
// and (IDM_ABOUTBOX < 0xF000) 
#define IDM_ABOUTBOX 0x0010 

MyWidget::MyWidget() : QMainWindow() 
{ 
... 
HMENU hMenu = ::GetSystemMenu(winId(), FALSE); 
if (hMenu != NULL) 
{ 
    ::AppendMenuA(hMenu, MF_SEPARATOR, 0, 0); 
    ::AppendMenuA(hMenu, MF_STRING, IDM_ABOUTBOX, "About MyApp..."); 
} 

... 
} 

bool MyWidget::winEvent(MSG *m, long *result) 
{ 
    if (m->message == WM_SYSCOMMAND) 
    { 
    if ((m->wParam & 0xfff0) == IDM_ABOUTBOX) 
    { 
     *result = 0; 
     // open About dialog 
     about(); 
     return (true); 
    } 
    } 

    return (false); 
} 

PRO-file: 
LIBS += -lUser32 
+0

感謝您的回覆。讓我試試看。 – Bharath 2014-09-08 12:01:47

+1

提供的解決方案有效,但有以下更改。 'QE中不支持'winEvent',它被'QWidget :: nativeEvent'取代。參見[QWidget :: nativeEvent()](http://qt-project.org/doc/qt-5/qwidget的.html#nativeEvent)。 其他一切保持不變。 再次感謝。 – Bharath 2014-09-08 12:42:17

+0

謝謝,這有很大的幫助。對於其他人,我可以添加:winEvent現在是nativeEvent(const QByteArray&eventType,void * m,long * result),並且您需要使用MSG投射m * msg = reinterpret_cast (m); – jaba 2017-09-29 15:03:30

相關問題