DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ToolStrip、MenuStripのボタンクリック

環境/言語:[Windows XP , VB,NET2005]
分類:[.NET]

2009/08/24(Mon) 11:26:58 編集(投稿者)
2009/08/24(Mon) 11:25:43 編集(投稿者)
2009/08/24(Mon) 11:01:13 編集(投稿者)

いつもお世話になっております。

Windowsフォームアプリケーションを作成しております。

あるフォーム(以下FormA)にToopStrip、MenuStripを作成し、
それぞれボタン(メニュー)がいつくか配置されています。(以下ツールボタン)

実行時、他のプロセスなり同一プロセスの別フォームにフォーカスがある時、
FormAのToolStrip、MenuStripにマウスを移動すると、
ツールボタンの表示が選択状態になります。(浮き出たような状態)

しかし、その状態でツールボタンをクリックしてもフォームにフォーカスが移動するだけで、
ツールボタンのクリック処理は実行されません。
実質、フォーカスがFormA以外にあるときにツールボタンのクリックイベントを発生させるには、
2回クリックすることが必要になります。

ToolStrip、MenuStripのMouseEnterイベントをとって、FormAにフォーカスを移動させると
クリックイベントをとれるのですが、
MouseEnterした時点でFormAが最前面に表示されてしまいます。

フォームに直接配置されたButtonのように、FormA以外にフォーカスがあるときに
一回クリックしただけでクリックイベントをとる方法はありませんでしょうか?

どなたか、いい案があれば是非ご教授頂きますよう
お願いいたします。
> ToolStrip、MenuStripのMouseEnterイベント

MouseDown にすればいいのでは?
#あれば、の話ですが
■No25286に返信(思いつきさんの記事)
> MouseDown にすればいいのでは?
> #あれば、の話ですが

あったとしてもそれが発生しないのが今回の現象(仕様)ですね。

実現方法のひとつとして思い浮かぶのは
フォームのWndProcをオーバーライドしてWM_LBUTTONDOWN等をつかみ
マウスの座標がToolStripMenuItem上であるならPerformClick メソッドを実行
というような感じでしょうか。

#それともメッセージをWM_LBUTTONDOWNにすり替えてMyBase.WndProc(m)すればよいのかな?

Microsoftのアプリでもクリックになるものとアクティブになるだけのものが混在していて、いずれにしろ仕様としか言えないですねぇ。
できればお客さまに妥協してもらいたい事案ですね。
2009/08/26(Wed) 10:42:08 編集(投稿者)

思いつきさん、まどかさん

ご助言ありがとうございます。

まどかさん案に関連して、
ToolStripのカスタムコントロールを作成し、
WndProcをオーバーライドしてメッセージのResultをすり替えることにしました。

関連URL
http://blogs.msdn.com/rickbrew/archive/2006/01/09/511003.aspx

しかし、納得できない仕様です…。

ありがとうございました!
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板