2009-05-01 16 views
2

ウィンドウにフォーカスがあっても非表示にする方法はありますか?私は2つの形式(AとB)を持っています。ユーザーがAとやりとりした後、フォーカスをBに戻します。フォーカス転送の結果(ユーザーがAをクリックしてからフォーカスがBに戻されます)は、フォームAがアクティブから非アクティブに点滅することです。これは醜いように見えます(特にAが一時的に大きな影を持つVistaの場合)。この点滅が起こらないように、私はどのようにAが非アクティブに見えるようにすることができますか?アクティブにしてもウィンドウが非表示になる

答えて

11

最後に、私は答えを見つけました!

警告:この回答の技術を悪用しないでください。これを行うと、ユーザーが混乱し、一般的なコンピューティングエクスペリエンスに害を及ぼします。下記のテクニックは、特定の状況(例えば、IntelliSenseのような動作を実装するなど)で非常に便利ですが、にしてください。

WM_NCACTIVATEメッセージは、非クライアント領域(つまり、境界線とタイトルバー)の状態を非アクティブまたはアクティブに変更するためにウィンドウに送信されます。メッセージのwParamは、状態が非アクティブかアクティブかを示します。 wParamがtrue(1の値)の場合、ウィンドウはアクティブに見えます。 wParamがfalse(値が0)の場合、ウィンドウは非アクティブに見えます。ウインドウを非アクティブまたはアクティブのままにするには、wParamを対応する値(0または1)に設定してオーバーライドすると、すべて設定されます。

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); 
} 
0

あなたはguiモデルのデフォルトの動作を変更することを話しています。私はそうするように勧めません。ユーザーがA上で何かをしている場合、Bに戻るとAは消えてはいけませんか?なぜそれは '点滅'ですか?フォーカスの変更が発生した場合は、1つのスイッチにする必要があります。

フォーカスのようなスイッチングしているあなたが記述するものから言うことができませんでした:

A-> B
B-> A->ユーザークリック - > B
B->

+0

私はVisualStudioのインテリセンスを模倣しようとしています。 Aは提案ウィンドウ、Bはユーザーがテキストを入力する場所です。ユーザーがA(選択した提案を変更するなど)をクリックすると、自動的にBにフォーカスが戻され、手動でフォーカスを戻さなくても入力を続けることができます。フォーカスの移動は次のようになります:フォーカスはBに設定され、ユーザーはマウスでAをクリックします。フォーカスをBに戻します。一時的にフォーカスを取得し、フォーカスを点滅(または点滅)させます。 。 –

0

これが役立つかどうかはわかりませんが、Winformsは所有フォームの概念をサポートしています。たとえば、フローティングツールバーはトップレベルウィンドウの外にあっても、トップレベルウィンドウがアクティブな場合でもアクティブなままです(逆も同様です)。同様に、フォームBを無効にしなくても、ユーザーはフォームAと対話できます。

これを達成するには、aを表示する直前にb.AddOwnedForm(a)に電話する必要があるようです。

+0

私はあなたの提案を試みましたが、残念ながら、所有されたウィンドウと親ウィンドウとの間の切り替えが、依然としてウィンドウの表示を非アクティブからアクティブに変えます。 –

関連する問題