ホストされた.NETランタイムとウィンドウフォーカス、問題、および矛盾
質問
.NETランタイムをホストし、アプリケーションのWin32部分から.NET管理フォームを開くWin32アプリケーションがあります。
これらのウィンドウは常にモーダルウィンドウとして開かれます。
一部のマシンでは、これらのウィンドウを閉じると、背後にあるWin32ウィンドウはフォーカスを取得しませんが、Word、Outlook、または他の開いているものの背後に送信されます。
また、このような.NETフォームを開いて、Altキーを押しながらWordまたは他のアプリケーションに移動し、アプリケーションのタスクバーアイコンをクリックすると、Win32ウィンドウが表示される場合があります。もちろん、これはモーダル.NETウィンドウが閉じるのを待っているため、当然使用できません。 Altキーを押しながら他の何かに移動し、その他のものを最小化すると、.NETウィンドウが再び表示されます。
一貫性のない部分は、すべてではなく、一部のマシンでのみ発生することです。私のマシンも含め、多くのマシンで、期待どおりに動作します。常に適切なウィンドウにフォーカスすることができます。
何か間違ったことをしたことは疑いませんが、問題が何であるかはわかりません。
誰が私が何を探しているべきか考えていますか?インストールされた.NETランタイムを確認しました。一方で動作し、他方では動作しないこのようなマシンが両方とも開発者マシンであるため、.NETなどの同じサービスパックが含まれています。
編集:ええ、 @sam 、あなたは正しかったのです。このレーンでのセットアップ。どちらのマシンもWindows XP SP3を実行していますが、私のマシンはクラシックなWindowsテーマを実行し、もう一方は新しいXPテーマを実行していました。他のコンピューターのテーマをクラシックに変更しても問題は解決しましたが、XPテーマに戻すと再表示されませんでした。
これで、2台のマシンが動作するようになりました。お客様はクラシックテーマを実行しているように見えますが、お客様にはまだ問題があります。
解決
最近、Windows Vista Aeroでは、XPで使用されていたウィンドウフォーカスが異なるように設定されていることに気付きました。メインウィンドウは、フォーカスを受け取るアプリの最後にアクティブ化されたウィンドウの代わりに、再アクティブ化にフォーカスを取得します。
面白いことは、vistaを古いスタイルのウィンドウテーマ(クラシックまたはベーシック)に変更すると、XPの場合と同じように、フォーカスが最後にあった子ウィンドウに設定されることです。
あなたの問題は非常に異なるかもしれませんが、多分あなたは異なるOSバージョンを手に入れましたか?
他のヒント
この問題により、WPFには親ウィンドウからダイアログを表示する場合と同じ問題があることが思い出されます。
.NETフレームワークのバージョン2.0を参照しており、.NETアセンブリを呼び出すネイティブモジュールがあると仮定します。
任意のコントロール Windowsフォーム(フォームも含む)から、 IWin32Window 。そのウィンドウのWin32ハンドルを公開します。
できることは、を使用することですNativeWindow を使用して、WM_ACTIVATEAPPまたはアプリにフォーカスがあることを通知するイベントをリッスンし、.NETウィンドウに信号を送信してフォーカスを取得します。
その他のオプションは、winforms(可能な場合)の代わりに.netユーザーコントロールをホストするネイティブダイアログを使用することです。
C ++ \ CLIを使用して、これまであまり手間をかけずにこれをやったことがありますが、今は思いつきません。たぶん、これはあなたにとって良い出発点になるでしょう。
同じ問題を抱えている友人を助けたことを思い出します(.net 2.0または3.5のどこにいるのか思い出せません)
メインフォームで新しいフォームを作成して使用すると仮定します
Form2 form2 = new Form2();
form2.ShowDialog();
モーダルポップアップを表示するために、ShowDialogメソッドはデフォルトでShowDialogをハンドラーとして呼び出すフォームを使用しないようですので、行う必要があります
form2.ShowDialog(this);
このようにして、私の知識に対するアプリケーションは、どのハンドルに戻るかを知っているので、常にメインから戻ります。
msdnフォームのShowDialogに関する追加情報: http://msdn.microsoft.com/en-us/library/w61zzfwe。 aspx