質問

AppBarを作成しました。 AppBarは常に焦点を合わせたときに常に上に留まります。その後、AppBarに戻るには、1つではなく2つのクリックが必要です。最初のクリックがフォームをアクティブにすると、2回目のクリックでマウスクリックイベントを受信すると思います(予想どおり)。あなたは何かアイデアを与えることができますか、ここで何が間違っているのでしょうか?私の問題はこれに似ています AppBarとフォーカスの問題. 。残念ながら、そのリンクのOPは彼のソリューションを投稿していません。

CodeProjectからこの記事に従ってAppBarを作成しましたC#はシェル、パート3を行います.

Spy ++で調べましたが、なぜこれが起こっているのかわからない。このシナリオをテストして取得したSpy ++ログは次のとおりです(最初のクリックは機能しません、2番目は機能します)。

<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 ウィンドウがアクティブになっている場合はイベント。しかし、なぜ他のウィンドウがアクティブになっていないのですが、ワンクリックで動作します(つまり、最初にクリックする必要はありません)。

編集: 問題はにだと思います ツールストリップ. 。私は持っています ツールストリップ 私のappbarで。今、私はこれをどのように検証しましたか?同じフォームで、ボタンを作成し、クリックイベントにメッセージボックスを表示しましたが、正常に動作しています。さて、それを改善する方法は?

役に立ちましたか?

解決

さて、私はついにそれを理解しました、そして(後世の利益のために)これが起こっていることです。問題はありません むしろ ツールストリップ (Wordで再現できます、私は信じています)。この機能は設計によるものであり、バグではありません。の中に wm_mouseActivate メッセージ、内部 ToolStripのwndproc, 、それはに戻ります ma_activateandeat ウィンドウをアクティブにします。つまり、フォーカスを提供しますが、マウスメッセージを破棄します。そのため、最初のマウスメッセージが破棄されるため、2回クリックする必要があります。

今解決策?オーバーライドします wndprocツールストリップ 派生したクラスで、およびメッセージを設定する代わりに、 ma_activateandeat, 、それを設定します ma_activate. 。これがそれを行う方法に関するチュートリアルです。 .NET 2.0ツールストリップとメノーストリップの「クリックスルー」を有効にする方法

それが役立つことを願っています:)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top