C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: WS_EX_NOACTIVATEを解除したい


(過去ログ 126 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■75302 / inTopicNo.1)  WS_EX_NOACTIVATEを解除したい
  
□投稿者/ pod (32回)-(2015/03/12(Thu) 11:41:04)

分類:[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としてビルドしています。

フォーム外のクリックでコンテキストメニューを確実に閉じさせるには
どのようにすればいいのでしょうか?

引用返信 編集キー/
■75304 / inTopicNo.2)  Re[1]: WS_EX_NOACTIVATEを解除したい
□投稿者/ 魔界の仮面弁士 (225回)-(2015/03/12(Thu) 17:16:25)
No75302 (pod さん) に返信
> フォームをアクティブ化させないために WS_EX_NOACTIVATE を使用しました。

昨夏の No72850 と同じアプリかな?


> そのためメニューの Opening 時に一旦 WS_EX_NOACTIVATE を解除し、

コンテキストメニューが開く際に、
 contextMenuStrip1.AccessibilityObject.Select(AccessibleSelection.TakeFocus);
を呼び出してみてください。
当方ではこれで、WS_EX_NOACTIVATE が付与されたままでも期待動作するようになりました。

――というか、上記を呼ばないとフォーカスがアクティブウィンドウに残ったままなので、
メニューアイテムを矢印キーで選択できないという。


> コンテキストメニューが閉じなくなってしまいます。

逆に言えば、コンテキストメニューさえ閉じられるのであれば、
件名にある「WS_EX_NOACTIVATEを解除したい」という前提条件を無視できるのでしょうか。

WS_EX_NOACTIVATE の付与だけなら、API を用意する必要は無く、
CreateParams プロパティだけで済ませられますよね。
引用返信 編集キー/
■75305 / inTopicNo.3)  Re[2]: WS_EX_NOACTIVATEを解除したい
□投稿者/ pod (33回)-(2015/03/12(Thu) 19:36:44)
No75304 (魔界の仮面弁士 さん) に返信

回答ありがとうございます。

> 昨夏の No72850 と同じアプリかな?
そうです。あの時は大変お世話になりました。

> コンテキストメニューが開く際に、
>  contextMenuStrip1.AccessibilityObject.Select(AccessibleSelection.TakeFocus);
> を呼び出してみてください。
> 当方ではこれで、WS_EX_NOACTIVATE が付与されたままでも期待動作するようになりました。

そんな方法があるのですね。こちらでも実際に組み込んで正しく動作しました。
WS_EX_NOACTIVATE が原因なら解除すれば直るはずと思い込んでいました。
コンテキストメニューを閉じるのが目的なのでこれで無事解決です。
この度もとても助かりました。ありがとうございます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -