2012-02-21 16 views
4

私はOwned windowsとその所有者の間の契約について知っており、所有者が隠されている場合は所有ウィンドウは隠されています。これは実際に私が望むものです。問題は、所有者ウィンドウの後にの所有者ウィンドウが最小化されている場合、所有ウィンドウが非表示ではなく通常は画面に表示されることです。この場合、WindowのWindowStateは起動時に最小化され、表示されているOwnedウィンドウが画面に表示されます。所有者が最小化された後に所有ウィンドウを非表示にする方法は?

私はShowOwnedPopupsにOSに強制的に所有されたすべてのウィンドウを非表示にすることができると知っていますが、これはオーナーウィンドウが実際に表示された後にのみ動作するように見えます。私は明示的にウィンドウを隠してみましたが(例えば、WS_VISIBLEビットを削除するかWM_SHOWCOMMANDを変更して隠して表示するようにしようとしましたが)、Ownerが復元されたときにOwnedウィンドウは表示されません。これは、ShowOwnedPopups APIのドキュメントと一致しており、それによってShowOwnedPopups呼び出しによって隠されたウィンドウだけが表示されます。

OSをウィンドウに表示させる方法を探しています。これは、オーナーが復元されるまでエンドユーザーに表示されないようにする方法です。 - または - ウィンドウにフラグを設定する方法ウィンドウを非表示にして、ShowOwnedPopupsを使用してウィンドウを隠してしまったと思ったら、手動でウィンドウを隠してそのフラグを設定します。

所有されたウィンドウを表示しているコードはシェルに関連付けられていないので、所有者が復元されるまで所有ウィンドウが表示されないという単純な問題ではありません。これは別のカスタムコントロールの一部です。この場合、WPFコントロールであるため、ElementHostでコントロールを使用することもできますので、所有ウィンドウのWindowStateだけを見ることはできません。しかし、どのWindows APIソリューションも歓迎されています。

+0

オーナーが最小化された後の所有者ウィンドウの表示方法は?タスクバーの所有ウィンドウをクリックしますか?要件でない場合は、タスクバーのウィンドウを隠すことができます。そのため、所有されているウィンドウを表示することは、ユーザーにとってより困難になります。あなたの事件について説明してください。 –

+0

この特定の場合、ショーは「自動」です。コントロールは、所有されているウィンドウを表示することを含む以前の状態を復元しています。だから、明らかにするために、ユーザーは私のコントロールを自分のウィンドウに置いた。ウィンドウのWindowStateを最小化に設定します。ウィンドウがロードされると、OSによって "最小化されて表示"され、コントロールが初期化/ロードされると、以前の状態が復元され、最後にコントロールが表示されたウィンドウが表示されます中古。 – AndrewS

+0

ところで、単純な例を見たい場合は、WPFアプリケーションを作成してください。作成するメインウィンドウのWindow状態をMinimizedに設定します。 Loadedイベントをフックします。例えば'void MainWindow_Loaded(オブジェクト送信者、RoutedEventArgs e) { var w =新しいウィンドウ(); w.Owner = this; w.Show(); } ' – AndrewS

答えて

0

これまで私のプロジェクトで使用していた少し汚いトリックですが、可視領域外にウィンドウを作成し、その領域を最小化して再度可視領域に移動することをお勧めします。以下のコードを確認してください。

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    var w = new Window(); // Create window 
    w.Owner = this;   // Set this window as owner 
    w.WindowStartupLocation = System.Windows.WindowStartupLocation.Manual; // Set startup location as manual 
    w.Left = -10000;  // Set x position to -10000 (or anything which makes it out of bounds) 
    w.Top = -10000;   // Set y position to -10000 
    w.Show();    // Show window (it will not be shown, not even blink) 
    w.WindowState = System.Windows.WindowState.Minimized; // Set window as minimized 
    w.Left = 100;   // Set x position to 100 (or whatever you want) 
    w.Top = 100;   // Set y position to 100 (or whatever you want) 
} 
+0

ありがとうございますが、技術的に所有者を最小化しても所有ウィンドウは最小化されません。所有者が復元されるまでウィンドウを隠すだけです。私は、OSが何をしているのかを知りたいだけで、Ownedウィンドウを非表示にしています。画面上にちらつきがなくても。私はそれがスクリーンから外れているので、ShowOwnedPopups(hwnd、false)を呼び出すように位置を調整しなければならなくなるかもしれませんが、私がそれを避けることができれば、むしろそうしたいと思います。 – AndrewS

+0

これは私がそれを「ダーティトリック」と呼んだ理由です。これは明らかに最良の方法ではなく、回避策です。 –

+0

この解決策を確認してください。それは働いているようだ。 http://social.msdn.microsoft.com/Forums/en/wpf/thread/f688e3b4-97e6-44e9-bd46-adff6c45f503 –

関連する問題