2010-06-24 4 views
3

Я создал AppBar. AppBar всегда остается на вершине, когда он теряет фокус, то для возврата в AppBar требуется два клика вместо одного. Я считаю, что первый щелчок активирует форму, а затем вторым щелчком мыши я получаю события щелчка мыши (как и ожидалось). Можете ли вы дать какие-то идеи, что здесь может быть неправильным? Моя проблема похожа на эту Appbar and focus issues. К сожалению, OP в этой ссылке не опубликовал его решение, грустно.AppBar focus issue

Я создал 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 

Глядя на журналы Spy ++, я считаю, что проблема с активацией, я думаю, что он получает только WM_LBUTTONDOWN событие, если окно активируется. Но почему другие окна не активируются, но они все еще работают одним щелчком мыши (т. Е. Мне не нужно сначала щелкнуть по нему).

EDIT: Я думаю, что проблема с ToolStrip. У меня есть ToolStrip в моем AppBar. Теперь, как я это подтвердил? Ну, в той же форме я создал кнопку и показал окно сообщения в своем клик-событии, и он работает нормально. Теперь, как исправить это?

ответ

2

Хорошо, я понял, наконец, и (в интересах потомства) это то, что происходит. Вопрос не с формой , а с ToolStrip (может быть воспроизведен в Word, я считаю). Эта особенность - по дизайну, а не к ошибке. В сообщении WM_MOUSEACTIVATE, внутри WndProc ToolStrip в, она возвращает MA_ACTIVATEANDEAT который активирует окно, т.е. дает ему фокус, но отбрасывает сообщение мыши, поэтому мы должны нажать дважды, поскольку первое сообщение мыши отбрасываются.

Теперь решение? Переопределение WndProc из ToolStrip в производном классе, и вместо того, чтобы свойство Message.Result в MA_ACTIVATEANDEAT, установите его в MA_ACTIVATE. Вот учебник о том, как это сделать. How to enable "click through" for .NET 2.0 ToolStrip and MenuStrip

Надеюсь, что это поможет :)