2013-08-12 47 views
3

時要防止用戶點擊我main_window當一個消息似乎我已經使用:WINAPI:窗口「發送到回」使用EnableWindow()函數

EnableWindow(main_window,FALSE); 

我有一個樣品的MessageBox:

EnableWindow(main_window,FALSE); 
MessageBox(NULL,"some text here","About me",MB_ICONASTERISK); 
EnableWindow(main_window,TRUE); 

問題是,當我按下我的MessageBox上的「確定」它關閉,我的main_window被髮送到所有其他系統窗口的背面。爲什麼發生這種情況? 我試圖把:

SetFocus(main_window); 
SetActiveWindow(main_window); 

後和之前:EnableWindow(main_window,TRUE)結果很奇怪:它的工作50/50。猜猜我是這樣做的,它不應該。

Btw。 是否有更好的解決方案,以攔截鼠標點擊對特定的窗口比:

EnableWindow(main_window,FALSE); 
+1

是否有一個原因,你沒有傳遞'main_window'作爲['MessageBox']的第一個參數(http://msdn.microsoft.com/en-us/library/windows/desktop/ms645505.aspx) ?如果這樣做,當消息框顯示時,擁有窗口將自動禁用,並在消除框消失時重新啓用。 – IInspectable

+0

謝謝@Tim它的工作:)。這是一個相當愚蠢的錯誤,對不起,我是初學者... – user2674257

回答

4

顯示模式的UI需要,模態的孩子被啓用和業主被禁用。當模態孩子完成時,程序必須顛倒過來。您發佈的代碼看起來像是實現這一點的直接方式。

除外,它不是。

問題出在MessageBoxEnableWindow的調用之間,您沒有編寫代碼。 MessageBox在模態子(消息框)已被銷燬後返回。由於這是具有前景激活的窗口,因此窗口管理器會嘗試找到一個新窗口來激活。沒有擁有窗口,所以它從Z順序的頂部開始搜索。它找到的第一個窗口是你的,但它仍然是禁用的。所以窗口管理器跳過它並尋找另一個窗口,一個窗口沒有被禁用。在執行EnableWindow的調用時,已經太晚了 - 窗口管理器已經斷定應該激活另一個窗口。

正確的順序是在銷燬模態UI之前啓用所有者。

但是,只有在您有理由自行實施模態時才需要這樣做。該系統爲模態UI提供了一個標準實現。爲了利用它,將句柄傳遞給擁有窗口的電話,例如MessageBoxCreateDialog(*),窗口管理器將爲您完成所有繁重工作。

(*):不正確的參數爲CreateDialog不幸命名爲hWndParent親子擁有者擁有關係非常不同(請參閱About Windows)。