|
分類:[C#]
VS C# 2013で、
フォームをアクティブ化させないために WS_EX_NOACTIVATE を使用しました。
その状態ではコンテキストメニューを開いてデスクトップをクリックしても
コンテキストメニューが閉じなくなってしまいます。
そのためメニューの Opening 時に一旦 WS_EX_NOACTIVATE を解除し、
Closing で再度 WS_EX_NOACTIVATE をセットしようと思い次のようにしました。
WS_EX_NOACTIVATEをセットする前のスタイルを一旦保存しています。
this.defaultStyle = GetWindowLong(this.Handle, GWL.EXSTYLE);
下記の関数でWS_EX_NOACTIVATEをセットしました
public void setNoActiveWindow(IntPtr hWnd)
{
UInt32 unStyle = (this.defaultStyle | WS_EX_NOACTIVATE);
UInt32 unret = SetWindowLong(hWnd, GWL.EXSTYLE, unStyle);
SetWindowPos(hWnd, IntPtr.Zero, 0, 0, 0, 0,
SWP.NOMOVE | SWP.NOSIZE | SWP.NOZORDER | SWP.FRAMECHANGED);
}
元のスタイルに戻すために次のような関数を作り Opening で呼び出しています。
コンテキストメニューは閉じたり閉じなかったりです。
最初の一回は成功で後は交互に失敗と成功になります。
public void setActiveWindow(IntPtr hWnd)
{
UInt32 unret = SetWindowLong(hWnd, GWL.EXSTYLE, this.defaultStyle);
SetWindowPos(hWnd, IntPtr.Zero, 0, 0, 0, 0,
SWP.NOMOVE | SWP.NOSIZE | SWP.NOZORDER | SWP.FRAMECHANGED);
}
フォームはボーダーを持たず、TopMost が有効です。
OS は Windows 7(64bit)で .NET 4.0 をターゲット、x86としてビルドしています。
フォーム外のクリックでコンテキストメニューを確実に閉じさせるには
どのようにすればいいのでしょうか?
|