2010-06-24 124 views
3

我已經創建了一個AppBar。當AppBar失去焦點時,它總是保持在最前面,然後回到AppBar需要兩次點擊而不是一次。我相信第一次點擊會激活表單,然後再次點擊我收到鼠標點擊事件(如預期的那樣)。你能給出任何想法,這裏有什麼可能是錯的?我的問題類似於這個Appbar and focus issues。不幸的是,該鏈接中的OP沒有公佈他的解決方案,傷心。AppBar焦點問題

我創建了應用條下面的文章CodeProject C# does Shell, Part 3

我用Spy ++研究過它,但不知道爲什麼會發生這種情況。這裏是我得到這個場景測試的Spy ++日誌(第一次點擊不起作用,第二次點擊)。

<00001> 00090CFE S WM_PARENTNOTIFY fwEvent:WM_LBUTTONDOWN xPos:25 yPos:17 
<00002> 00090CFE R WM_PARENTNOTIFY 
<00003> 00090CFE S WM_WINDOWPOSCHANGING lpwp:0418EAE4 
<00004> 00090CFE R WM_WINDOWPOSCHANGING 
<00005> 00090CFE S WM_ACTIVATEAPP fActive:True dwThreadID:00000000 
<00006> 00090CFE R WM_ACTIVATEAPP 
<00007> 00090CFE S WM_NCACTIVATE fActive:True 
<00008> 00090CFE R WM_NCACTIVATE 
<00009> 00090CFE S WM_ACTIVATE fActive:WA_CLICKACTIVE fMinimized:False hwndPrevious:(null) 
<00010> 00090CFE S WM_IME_SETCONTEXT fSet:1 iShow:C000000F 
<00011> 00090CFE S WM_IME_NOTIFY dwCommand:IMN_OPENSTATUSWINDOW dwCommand:00000002 dwData:00000000 
<00012> 00090CFE R WM_IME_NOTIFY 
<00013> 00090CFE R WM_IME_SETCONTEXT 
<00014> 00090CFE S WM_SETFOCUS hwndLoseFocus:(null) 
<00015> 00090CFE R WM_SETFOCUS 
<00016> 00090CFE R WM_ACTIVATE 

Now happens the second click (which works) 
<00017> 00090CFE S WM_PARENTNOTIFY fwEvent:WM_LBUTTONDOWN xPos:25 yPos:17 
<00018> 00090CFE R WM_PARENTNOTIFY 
<00019> 00090CFE S WM_WINDOWPOSCHANGING lpwp:0418E40C 
<00020> 00090CFE R WM_WINDOWPOSCHANGING 

望着間諜++日誌,我相信這個問題是激活的,我想,如果窗口被激活,它僅接收WM_LBUTTONDOWN事件。但是,其他窗口怎麼沒有被激活,但他們仍然只需點擊一下(即我不必先點擊它)。

編輯:我認爲問題是與ToolStrip。我在我的AppBar中有一個ToolStrip。現在我如何驗證這一點?在相同的表單上,我創建了一個按鈕,並在其click事件中顯示了一個消息框,並且它工作正常。現在該如何補救?

回答

2

好吧,我終於明白了(爲了後人的利益),這就是發生了什麼事。這個問題不在於表格而是ToolStrip(我相信可以在Word中複製)。此功能是由設計而非錯誤。在WM_MOUSEACTIVATE消息,裏面ToolStrip中的WndProc,則返回MA_ACTIVATEANDEAT激活你的窗口,即給予其焦點,但丟棄的鼠標消息,這就是爲什麼我們有,因爲第一個鼠標消息被丟棄點擊兩次。

現在的解決方案?覆蓋的的WndProc ToolStrip的在派生類,而不是Message.Result屬性設置爲MA_ACTIVATEANDEAT,將其設置爲MA_ACTIVATE。這裏是一個關於如何去做的教程。 How to enable "click through" for .NET 2.0 ToolStrip and MenuStrip

希望能幫到:)