カテゴリー別

お絵描き、デザイン

写真、動画関連ソフト

アメーバピグ専用ソフト

ホームページ関連

画像処理

スキャナー用

SEO 関連

お楽しみ

その他

過去ログ

2013年01月21日(月)

Windows 8+.NET Framework 4.5 で、MenuStrip.MenuDeactivate が発生しない

Windows 8 + .NET Framework 4.5 の環境で、MenuStrip の
メニューを開いてから、別の場所をクリックして閉じた場合に、
MenuStrip.MenuDeactivate イベント が発生しませんでした。


Photos by Lye Hock

例えば、ファイル(F) を 2回クリックして、ドロップダウンを
開いてから閉じたときに、Windows 7 + .NET 4.0 で発生する、
MenuDeactivate が Windows 8 + .NET 4.5 では発生しません。

このとき、MenuStrip のキーボードフォーカスは無くなっているので、
発生しないのは、Windows 8 + .NET 4.5 のバグだと思います。
(たぶん、.NET 4.5 のバグと思われるが未確認)

回避方法

MenuStrip の子アイテムが閉じたときに、
MenuStrip.KeyboardActive を false に設定すれば OK です。

↓ 子アイテムが閉じたときのイベントハンドラを設定するコード断片

foreach (ToolStripMenuItem menu in menuStrip.Items)
  menu.DropDownClosed += TopMenu_DropDownClosed;

↓ KeyboradActive を false に設定するコード断片。
↓ (KeyboardActive は、protected なので・・・)

private void TopMenu_DropDownClosed(object sender, EventArgs e)
{
  Type type = typeof(MenuStrip);
  var pi = type.GetProperty(
    "KeyboardActive", BindingFlags.NonPublic | BindingFlags.Instance
  );
  pi.SetValue(menuStrip, false, null);
}

副作用

副作用は、あまりありませんが、メニューを Esc で閉じた場合に、
Deactivated と Activated が連続して発生します。

Esc で閉じた場合には、MenuStrip がキーボード操作可能なままなので、
Deactivated、Activated の発生は、不要です。

応用例

ミルノ PC フォトフレーム の MenuStrip がアクティブな場合、
メニューパネルを自動的に隠さない処理に影響がありました。


コメント
コメントする