2016-04-26 15 views
1

CWindThreadCWinApp::InitInstance()に作成します。そのスレッドでは、ダイアログを作成します(そのダイアログにプログレスバーを表示するため)。他のスレッドからダイアログを閉じるとメインウィンドウからフォーカスできない

InitInstance()が終了した後、ダイアログボックスからDestroyWindow()を呼び出してダイアログを閉じますが、アプリケーションがメインウィンドウからフォーカスを失っています。

メインウィンドウのフォーカスを設定するのにAfxGetMainWnd()->SetActiveWindow();を使用しましたが、動作しません。

ダイアログを閉じた後、メインウィンドウにフォーカスを戻すにはどうすればよいですか?

+0

SetFocus() - 関数を試しましたか? https://msdn.microsoft.com/en-us/library/ms646312(VS.85).aspx –

+0

'pMainFrame-> SetFocus()'を使用しましたが動作しません – KidNg

+2

あなたの実装は後方にあります:ワーカースレッドに通知し、そこからGUIスレッドに通知します。クロススレッドウィンドウの階層は、維持するのが非常に困難です。 – IInspectable

答えて

0

これを行うには本当に良い方法はありません。フォーカスはスレッドごとに設定されます。したがって、すべてのウィンドウに「フォーカス」はありません。

唯一のチャンスは、他のスレッドに属する新しいフォアグラウンドウィンドウをSetForegorundWindowに設定することです。同じアプリケーションの中から、これは制限なしで動作するはずです。

動作しない場合は、両方のメッセージキューを同期させる必要があります。これはAttachThreadInputによって行われます。両方のメッセージキューがすでに接続されている場合は、設定に問題がないため、直接フォーカスします。しかし、アプリケーションの動作が変わります...私もリンクされている機能のドキュメントを読んでください。

+0

問題は複雑です。なぜなら、システムのいくつかの状態は常にスレッド単位であり、システム全体ではないからです。フォーカスはアクティブなウィンドウなどのようなものです。単にSetForegroundWIndowにSetFocus ...の代わりにチャンスを与えてください。それは速い解決策かもしれません。 – xMRi

+0

このシナリオでは、「AttachThreadInput」はノーオペレーションです。クロススレッド親/所有者関係をインストールすると、システムは参加スレッドの入力キューを暗黙的に接続します。 – IInspectable

+0

これはあなたの解が間違っているために複雑です。 –

0

モーダルポップアップウィンドウが表示されている場合、ユーザーがオーナーウィンドウと対話できない理由は、モーダルポップアップウィンドウが無効になっていることです。モーダルウィンドウが破棄されると、ウィンドウが無効なウィンドウをアクティブにすることができないので、ポップアップを破棄する前にオーナーウィンドウを再度有効にするように注意する必要があります。これはポップアップウィンドウが間違ったウィンドウを再起動する通常の原因です。

+1

モダリティは所有者/所有関係を使用して実装され、子/親関係は使用されません。 – IInspectable

関連する問題