2014-03-04 39 views
0

我創建簡單handler inside my QApplication如何在winEventFilter上取消WM_CLOSE?

bool QtMyApplication::winEventFilter (MSG * msg, long * result){ 
    switch(msg->message) { 
     case WM_CLOSE:{ 
      qDebug() << "Haha Not killing appp =)"; 
      *result = 0; 
      return true; 
      break; 
     } 
    } 
    return false; 
} 

我開始我的應用程序,打開任務管理器,在我的Qt應用程序,並在fiew秒叫End Task得到消息:

enter image description here

我也得到了在我的QMainWindow上執行QWidget WinEvent的相同結果:

bool QMyMainWindow::winEvent(MSG *message, long *result) 
{ 
    switch(message->message) { 
     case WM_CLOSE:{ 
      qDebug() << "Haha Not killing appp =)"; 
      *result = 0; 
      return true; 
      break; 
     } 
    } 

    return QMainWindow::winEvent(message, result); 
} 

注意應用程序和任務管理器從AdministratorWindows Server 8 r2

所以開始我不知道如何處理WM_CLOSE通過任務管理器上QApplicationQMainWindow發送,從而不會顯示End Programm消息?

+0

@ratchetfreak:我要的是展現給用戶我的窗口(允許保存文件退出等之前)! – DuckQueen

回答

0

從評論中,似乎真正的問題是如何在任務管理器關閉之前詢問用戶有關保存文件的信息。這是一個奇怪的問題,因爲從任務管理器關閉應用程序通常是最後的手段。

當用戶試圖以常見方式關閉應用程序時,詢問用戶保存文件是完全合理的,例如從菜單中選擇退出或單擊主窗口上的關閉按鈕。所以繼續並處理WM_CLOSE來做到這一點。

但請記住,還有很多其他方式可以終止進程。例如,用戶可能會註銷或關閉計算機,否則電源可能會熄滅,或者您的程序可能因爲錯誤而崩潰,或者用戶可能試圖從任務管理器中終止進程(可能是因爲它掛起) 。

在這些情況下,您實際上沒有選擇提供交互式問題。

選項1:保存文件時不詢問。您可以使用不同的文件名保存它,以便在用戶有意跳過保存時原始文件仍然可用。下一次應用程序啓動時,它可以檢查這些「緊急保存」是否存在,然後詢問用戶他/她想使用哪個副本。

選項2:消除保存的概念。隨着用戶編輯內存中的副本,使文件保持最新。將所有事務都做成事務很棘手,這樣文件永遠不會處於不良狀態,但它適用於某些類型的應用程序。

選項3:間隔自動保存(這是實現選項2的簡化方式)。這樣,如果進程死亡,用戶只會丟失自上次自動保存以來的更改。

0

更好的(而不是特定於平臺的)方法來做到這一點,而不是尋找窗口系統關閉事件,是在你的主窗口中重新實現Qt closeEvent函數。假設您的應用程序設置了quitOnLastWindowClosed標誌,則在窗口關閉時它會退出。

在主窗口的代碼,實現closeEvent

void MainWindow::closeEvent(QCloseEvent *event) 
{ 
    if(want_to_check) 
    { 
     int result = QMessageBox::critical(this, tr("Are you sure"), 
        tr("Are you sure you want to exit?"), 
        QMessageBox::Yes | QMessageBox::No); 
      if(result==QMessageBox::Yes) 
      { 
        // You can save files, etcetera, here 
        event->accept(); // The event is accepted, the window will close, and the application will exit 
      } 
      else 
      {  // Your window will not close, and application will stay open 
        event->ignore(); // The window will stay open 
      } 
     } 
    } 
+0

我也嘗試使用closeEvent - 不幸的是,任務管理器在約3秒內顯示「結束任務」消息=( – DuckQueen