2009-05-01 26 views
2

有沒有辦法讓窗口保持非活動狀態,即使它包含焦點?我有兩種形式(A和B)。在用戶與A交互之後,我將焦點轉移回B.焦點轉移的結果(用戶點擊A,然後焦點轉移回B)是表單A從活動狀態閃爍到非活動狀態。這看起來很醜陋(尤其是在Vista上,瞬間會有更大的影子)。我如何讓A保持非活動狀態,以避免這種閃爍現象?即使在激活時仍保持窗口無效外觀

回答

11

最後,我找到了答案!

警告:請勿濫用此答案的技術。這樣做會混淆您的用戶,並且會損害一般的計算體驗。下面描述的技術在某些情況下可能非常有用(例如,實施類似智能感知的行爲),但在您的使用中明智。

WM_NCACTIVATE消息被髮送到一個窗口,將其非客戶區域(即邊界和標題欄)的狀態更改爲非活動或活動狀態。消息的wParam指示狀態是否處於非活動狀態或活動狀態。如果wParam爲真(值爲1),該窗口將顯示爲活動狀態。如果wParam爲假(值爲0),該窗口將看起來無效。要強制一個窗口保持不活動狀態或活動狀態,通過將wParam設置爲相應的值(0或1)來覆蓋wParam,並且您將全部設置!

private const int WM_NCACTIVATE = 0x0086; 

protected override void WndProc(ref Message m) 
{ 
    if (m.Msg == WM_NCACTIVATE) 
    { 
     // Use this to make it always look inactive: 
     m.WParam = (IntPtr)0; 

     // Alternately, use this to make it always look active: 
     m.WParam = (IntPtr)1; 
    } 

    base.WndProc(ref m); 
} 
0

您正在討論更改gui模型的默認行爲。我不會建議這樣做。如果用戶在A上做某事,那麼回到B不應該A消失?爲什麼它「閃爍」?焦點改變發生時,它應該是一個單一的開關。

無法從你的描述說是焦點切換,如:

A-> B
B-> A->用戶點擊 - >乙
B-> A

+0

我想模仿VisualStudio的intellisense。 A是建議窗口,B是用戶輸入文本的位置。用戶點擊A(更改選定的建議等)後,我會自動將焦點設置回B,以便用戶不必手動設置焦點即可繼續輸入。焦點轉移是這樣的:焦點在B上設置,用戶在A上點擊,在鼠標上時我將焦點設置回B.瞬間獲得焦點,導致焦點閃爍(或閃爍),我想停止。 – 2009-05-02 20:11:35

0

不知道這是否有幫助,但Winforms支持自有表單的概念。例如,即使浮動工具欄位於頂層窗口之外,即使頂層窗口處於活動狀態(反之亦然),它們仍保持活動狀態。同樣的,你希望用戶能夠與您的形式的互動,而無需停用形式B.

要做到這一點,這聽起來像你需要調用b.AddOwnedForm(a)您展示a之前。

+0

我嘗試了你的建議,但不幸的是,擁有窗口和父窗口之間的焦點切換仍然將窗口的外觀從不活動變爲活動。 – 2009-05-02 20:17:38