フォーカスが含まれていても、ウィンドウを非アクティブに保つ方法はありますか? 私は2つのフォーム(AとB)を持っています。ユーザーが A と対話した後、フォーカスを B に戻します。フォーカスが移動した結果 (ユーザーが A をクリックし、フォーカスが B に戻されます)、フォーム A がアクティブから非アクティブに点滅します。これは醜く見えます (特に、A が一時的に大きな影になる Vista では)。この点滅が起こらないように、A を非アクティブな状態に保つにはどうすればよいですか?
3 に答える
ついに答えが見つかりました!
警告: この回答の手法を乱用しないでください。これを行うと、ユーザーが混乱し、一般的なコンピューティングエクスペリエンスに悪影響を及ぼします。以下で説明する手法は、特定の状況(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);
}
これが役立つかどうかはわかりませんが、Winformsは所有フォームの概念をサポートしています。たとえば、フローティングツールバーはトップレベルウィンドウの外にありますが、トップレベルウィンドウがアクティブな場合でもアクティブなままです(その逆も同様です)。同様に、フォームBを非アクティブ化せずに、ユーザーがフォームAを操作できるようにする必要があります。
b.AddOwnedForm(a)
これを実現するには、表示する直前に電話をかける必要があるようですa
。
GUIモデルのデフォルトの動作を変更することについて話している. そうすることはお勧めしません。ユーザーが A で何かをしている場合、B に戻っても A は消えませんか? なぜ「点滅」するのですか?フォーカスの変更が発生したときは、単一のスイッチである必要があります。
あなたが説明したことから、次のようなフォーカスの切り替えはわかりませんでした:
A->B
B->A->ユーザークリック->B
B->A
?