アクティブになっている場合でも、ウィンドウを非表示のままにする
-
03-07-2019 - |
質問
ウィンドウにフォーカスが含まれている場合でも、ウィンドウを非アクティブに保つ方法はありますか? 2つのフォーム(AとB)があります。ユーザーがAと対話した後、フォーカスをBに戻します。フォーカス転送の結果(ユーザーがAをクリックしてから、フォーカスがBに戻される)は、フォームAがアクティブから非アクティブに点滅することです。これはいようです(特にVistaでAが一時的に大きな影を取得する場合)。この点滅が起こらないようにAを非アクティブにするにはどうすればいいですか?
解決
ようやく答えが見つかりました!
警告:この回答の手法を悪用しないでください。 これを行うと、ユーザーが混乱し、一般的なコンピューティングエクスペリエンスに悪影響を及ぼします。以下に説明する手法は、特定の状況(たとえば、IntelliSenseのような動作を実装する)で非常に役立ちますが、使用方法については慎重に 慎重に検討してください。
WM_NCACTIVATE メッセージは、非クライアント領域(境界線とタイトルバー)の状態を非アクティブまたはアクティブに変更するウィンドウ。メッセージのwParamは、状態が非アクティブかアクティブかを示します。 wParamがtrue(値1)の場合、ウィンドウはアクティブに見えます。 wParamがfalse(値0)の場合、ウィンドウは非アクティブに見えます。ウィンドウを強制的に非アクティブまたはアクティブのままにするには、対応する値(0または1)に設定してwParamをオーバーライドします。これですべて設定されます!
private const int WM_NCACTIVATE = 0x0086;
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_NCACTIVATE)
{
// Use this to make it always look inactive:
m.WParam = (IntPtr)0;
// Alternately, use this to make it always look active:
m.WParam = (IntPtr)1;
}
base.WndProc(ref m);
}
他のヒント
GUIモデルのデフォルトの動作を変更することについて話しています。そうすることはお勧めしません。ユーザーがAで何かをしている場合、Bに戻るとAは消えませんか?なぜ「点滅」しているのですか?フォーカスの変更が発生した場合は、単一のスイッチにする必要があります。
フォーカスの切り替えがどのように説明されているかわかりません:
A-> B
B-> A->ユーザークリック-> B
B-> A
?
これが役立つかどうかはわかりませんが、Winformsは所有フォームの概念をサポートしています。たとえば、フローティングツールバーはトップレベルウィンドウの外側に存在しますが、トップレベルウィンドウがアクティブな場合でもアクティブのままです(逆も同様です)。同様に、フォームBを無効にすることなく、ユーザーがフォームAとやり取りできるようにする必要があります。
これを実現するには、 a
を表示する直前に b.AddOwnedForm(a)
を呼び出す必要があるようです。