3

.NET ランタイムをホストし、アプリケーションの Win32 部分から .NET 管理フォームを開く Win32 アプリケーションがあります。

これらのウィンドウは、常にモーダル ウィンドウとして開かれます。

一部のマシンでは、これらのウィンドウが閉じられると、後ろにある Win32 ウィンドウにフォーカスが移らず、Word、Outlook、または開いているその他のウィンドウの後ろに送られます。

また、そのような .NET フォームを開き、alt-tab キーを押して Word またはその他のアプリケーションに移動し、アプリのタスクバー アイコンをクリックすると、Win32 ウィンドウが表示されることがあります。もちろん、これはまだモーダル .NET ウィンドウが閉じるのを待っているため、もちろん使用できません。alt-tab キーを押して別の場所に移動し、その場所を最小化すると、.NET ウィンドウが再び表示されます。

一貫性のない部分は、これがすべてのマシンではなく一部のマシンでのみ発生することです。私のものを含め、多くのマシンで、期待どおりに動作します。右ウィンドウへのフォーカスは毎回機能します。

私たちが何か間違ったことをしたことは間違いありませんが、何が問題なのかわかりません。

誰が私が何を探しているべきか知っていますか? インストールされている .NET ランタイムを確認しました。一方では動作し、他方では動作しない 2 つのマシンは両方とも開発者用マシンであるため、.NET などの同じサービス パックが含まれています。


編集:まあ、@ サム、このレーンにいくつかの異なるセットアップがあったという点で、あなたは正しかった. どちらのマシンも Windows XP SP3 を実行していますが、私のマシンは従来の Windows テーマを実行しており、もう 1 つは新しい XP テーマを実行していました。他のコンピューターのテーマをクラシックに変更すると問題は解決しましたが、XP テーマに戻しても問題は再現しませんでした。

これで 2 台のマシンが動作するようになりましたが、顧客はクラシック テーマを実行しているように見えますが、まだ問題を抱えています。

4

3 に答える 3

2

最近、Windows Vista Aero のウィンドウ フォーカスの設定が、XP の場合とは異なることに気付きました。アプリの最後にアクティブ化されたウィンドウがフォーカスを受け取る代わりに、メイン ウィンドウが再アクティブ化でフォーカスを受け取ります。
おもしろいことに、vista を古いスタイルの Windows テーマ (クラシックまたはベーシック) に変更すると、XP の場合と同じように、最後にあった子ウィンドウにフォーカスが設定されます。

問題は大きく異なる可能性がありますが、OS のバージョンが異なる可能性がありますか?

于 2008-10-17T10:36:22.923 に答える
1

この問題は、WPFに親ウィンドウからのダイアログの表示と同じ問題があることを思い出させます。

.NET Frameworkのバージョン2.0を参照していて、.NETアセンブリを呼び出すネイティブモジュールがあることを前提としています。

Windowsフォーム(フォームも含む)からのコントロールは、 IWin32Windowと呼ばれるインターフェイスを実装し、そのウィンドウのWin32ハンドルを公開します。

できることは、NativeWindowを使用して、WM_ACTIVATEAPPまたはアプリにフォーカスがあることを通知するイベントをリッスンし、フォーカスを取得するために.NETウィンドウに信号を送信することです。

他のオプションは、winformsの代わりに.netユーザーコントロールをホストするネイティブダイアログを使用することです(可能な場合)。

私は以前、C ++ \ CLIを使用して、あまり手間をかけずにこれを実行しましたが、今は思い浮かびません。多分これはあなたにとって良い出発点になるでしょう。

于 2008-10-17T11:28:07.343 に答える
0

同じ問題で友人を助けたことを思い出します (それが .net 2.0 または 3.5 のどこにあるのか思い出せません)

メインフォームで新しいフォームを作成して使用すると仮定します

Form2 form2 = new Form2();
form2.ShowDialog();

モーダル ポップアップを表示するには、ShowDialog メソッドがデフォルトで ShowDialog を呼び出すフォームをハンドラーとして使用していないように見えるため、次のようにする必要があります。

form2.ShowDialog(this);

このようにして、私の知る限り、アプリケーションはどのハンドルに戻るかを知っているため、常にメイン元に戻ります。

ShowDialog フォーム msdn に関する追加情報: http://msdn.microsoft.com/en-us/library/w61zzfwe.aspx

于 2008-10-17T11:42:34.163 に答える