2011-08-09 37 views
8

在長期操作過程中,我們的C++ Win32應用程序顯示一個模態狀態對話框,其中每隔幾秒鐘左右不定期更新一個進程欄。從Windows 7開始,我們意識到Windows很快會顯示一條消息「似乎掛起...」和/或將「未響應」附加到我們的窗口標題欄。忙碌的應用程序在Windows 7上導致錯誤的「無響應」狀態 - WM_UPDATE

我們發現進程對話框必須處理消息以避免這種情況。更具體地說,Windows 7似乎不斷髮送WM_UPDATE消息來檢查我們的程序是否存在。我們之前已經在此對話框中禁用了所有不需要的消息處理,因爲配置文件運行表明它們是主要的減速。儘管我們已經解決了這個問題,但用戶仍然在報告這些問題:Windows顯示「似乎掛起...」和/或將「未響應」附加到窗口標題欄上,儘管我們每次處理所有事件幾秒鐘。

問題:

  • 是否有關於Windows 7(或Windows Vista)這種行爲變化的任何文檔?我們還沒有找到任何。我們還發現了許多其他消息行爲的變化。

  • 是否有可能從Windows禁用所有這些「活着」檢查的方法?我們的應用程序非常活躍,流程可能需要很長時間。

編輯:更具體的 - 我們只能做到每幾秒鐘被調用消息泵PeekMessage/TranslateMessage/DispatchMessage

由於這是一個相當古老的遺留程序,在不久的將來不可能使用單獨的工作線程。我們當然會爲新代碼做這件事。請注意,我的主要觀點是,這種行爲絕對隨Windows Vista/Windows 7而改變。我還沒有發現任何文檔。

+1

這對於後臺工作線程來說是大喊大叫。 – Deanna

+2

「禁用所有**不需要**消息處理」 - MSDN對此主題非常清楚:「如果[窗口過程]不處理消息,它必須**將消息發送回系統進行默認處理。窗口過程通過調用'DefWindowProc'函數來完成。「 – MSalters

+0

請參閱我的編輯 –

回答

18

那麼,你的問題的直接答案是,你可以撥打DisableProcessWindowsGhosting()

但是,解決問題的根源而不是抑制症狀會好得多。您的窗口正在幻影,因爲您沒有抽取消息隊列。你沒有這樣做,因爲你的應用程序忙於工作的令人敬佩的理由。接受的工作方式,並保持你的隊列泵,是在一個單獨的線程完成工作。

+0

感謝您的回答。該文檔稱「窗口重影是一項Windows管理器功能,可讓用戶最小化,移動或關閉未響應的應用程序的主窗口。」它沒有說關於禁用「似乎掛起筆記」的任何內容。你對此有更多瞭解嗎? –

+2

當您禁用重影時,您將看不到附加到標題等的任何「(無響應)」文字。 –

+0

同樣從UX的角度來看,通過使用不同的線程,您可以使用當前版本向用戶提供反饋他們的任務的進展。 – Ben

相關問題