2009-07-17 12 views
2

Windowsフォーム、.net 2.0別のフォームと同じzオーダーの新しいフォームを作成する

メインアプリケーションのスレッドは、フォーム(A)を持っています。私は、アクティビティが発生したことを判断するためにタイマーをオフにするバックグラウンドスレッドを持っています - それが起きると、メインアプリケーションフォームが非表示になり(BeginInvokeを使用して)、独自のスレッド(B)メッセージポンプ)。

2つのスレッドは複雑に聞こえますが、残念ながら必要です。

新しいメッセージポンプの新しいフォームは、最上位ではないフォームの上部に表示されます(期待どおりです)。しかし、元のアプリケーションがデスクトップの上にない場合、これは非常に面倒です。

元のフォーム(A)のzオーダーがどのようなものであるかを確認したいと思います。元のフォームのzオーダーをミラーリングして新しいフォーム(B)を作成します。

アイデア?

[これは、現在のユーザーのデスクトップ上にある場合(つまり、パスワードなしの場合)、フォームセーバーでポップアップするという副作用があります。これを解決できない場合は、これを避けたいのですが...]

+0

2番目のフォームはそれ自身のスレッドです。私は何度も何度も開発者が自分のフォームを "マルチスレッド"する必要があると確信しています。私はそこには事例がないと言っているのではないが、ユーザーが誤ったアプローチをしていることが多い。 –

+0

メインスレッドは、多くのフォーム、サブフォームなどを含む複雑なLOBアプリケーションです。第2のスレッドは、後で復元できる現在のダイアログボックスを含むすべてのフォームを非表示にしてメインアプリケーションを「ロック」するセキュリティプロシージャです。これらのフォームの一部は、当社の管理下にない第三者図書館によって作成されています。セキュリティ要件が設計の初めから存在していた場合は、2番目のアプリケーションポンプが必要ではないかもしれませんが、ロックがサードパーティのフォームなどを処理するのに十分な「汎用」であることを意味します。 –

+0

ダイアログを表示しようとしましたか.ShowDialog(Me)または.ShowDialog(this)を使用して転送します。親への参照でShowDialogを使用すると、入力から親フォームがロックされ、フォーカスが許可されなくなります。 –

答えて

1

これを解決するには、Win32のGetWindow関数を使用して、以前のウィンドウがメインフォーム用であったかどうかを判断します。次に、2番目のスレッドで新しいフォームを作成するときに、SetWindowPosを使用してzオーダーを最初のステップで取得した値に設定できます。

は、私はまた、アプリケーションがフォーカスされたアプリケーションがいたかどうかを判断するためにnobugz提案を使用して、私はShowWithoutActivationのオーバーライドを使用しない場合は、私の新しいフォームがアクティブに起動しないことを確実にするために、私は持つの後ろにあなたの推論を聞いて興味

+0

nobugzの答えが削除されているようですので、この回答はあまり役に立ちません:-( –

0

AFAIKでは、Form.Activate()を呼び出すと前面に表示されますが、WinFormsではWindowsレベルのzオーダーはわかりません。あなたはWin32でもっと良い運があるかもしれません。

+0

ええ、私はそれを前面に持っていきたくありません - それがポイントです。私はむしろWin32から何かを呼び出す必要があると仮定しましたが、私は何がわからないのですか? –

関連する問題