2010-01-19 20 views
1

我試圖調試一個巨大的Win32 GUI應用程序(我有完整的源代碼)分成幾個進程。問題如下:在一個進程中,我有一個對話框和一個列表框,當我雙擊列表框中的一個項目時,另一個進程開始創建自己的窗口,它被放在前面並覆蓋了初始對話框。如果我做了一些操作(我不能完全解釋,因爲我還沒有完全理解它們),有些東西強制初始對話框在任務欄中開始閃爍。在哪些場合發送WM_ACTIVATE?

我想微軟間諜++和看到,每當我這樣做處理WM_ACTIVATE發送到對話框中,大多數時候它有這些參數:

fActive: WA_INACTIVE fMinimized:False hwndPrevious:(null) 

,並在這些情況下,對話框不會開始閃爍。但偶爾一次參數是

fActive: WA_ACTIVE fMinimized:False hwndPrevious:(null) 

並且恰好對應於對話框閃爍。

MSDN says WM_ACTIVATE發送與WA_ACTIVE當窗口是比鼠標點擊一些其它方法激活(例如,通過向SetActiveWindow功能或通過使用鍵盤接口的呼叫來選擇窗口)

現在在應用程序代碼中SetActiveWindow()永遠不會被調用,我不會對可以切換窗口的鍵盤做任何事情。

WM_ACTIVATE與WA_ACTIVE一起發送的原因是什麼?

回答

3

您的問題是由SetForegroundWindow()造成的。它有適當的反制措施,可以防止在她正在另一個應用程序中工作時,某個過程將窗戶推向用戶的臉部。

SetForegroundWindow()正在發生,當第二個進程創建它的窗口並隱式地嘗試使用它的前景。 (當你寫下「帶到前面」時,你說的太多了。)

第一個應用程序應該調用AllowSetForegroundWindow()來說「沒關係,該窗口允許我從前臺激活」。

請注意,如果你這樣做,那麼用戶可能會遇到這種情況:

  • 用戶點擊列表框項目。
  • 第二個過程啓動緩慢。
  • 用戶在第一個應用程序中點擊其他內容。 (失去耐心。)
  • 第二個進程從第一個應用程序中竊取前臺。 (用戶感到沮喪,因爲他是在做別的事情的中間。)

這是導致在當前的代碼閃爍的情況。窗口管理器檢測到用戶已經放棄等待第二個進程並開始對第一個進程執行其他操作,所以當它最終試圖竊取前景時會阻止第二個進程。

0

如果您使用WS_VISIBLE樣式創建窗口,該窗口將在創建時激活。

如果你做一個ShowWindow(SW_SHOW)會激活窗口(使用SW_SHOWNA代替)

如果你做一個SetWindowPos沒有SWP_NOACTIVATE標誌,窗口將被激活。

最後,如果您使用模板(CDialog)創建窗口,則始終激活該窗口。

+0

關於我所說的話,如果是對話框,可以防止它被激活,您需要在OnInitDialog中返回FALSE,並且必須在沒有WS_VISIBLE樣式的情況下創建對話框,並且使用ShowWindow (SW_SHOWNA) – Hyksos 2010-10-12 22:10:44

相關問題