質問
次のコードを使用して、メインウィンドウを非表示にしてアプリケーションを作成しています:
STARTUPINFO siStartupInfo;
PROCESS_INFORMATION piProcessInfo;
memset(&siStartupInfo, 0, sizeof(siStartupInfo));
memset(&piProcessInfo, 0, sizeof(piProcessInfo));
siStartupInfo.cb = sizeof(siStartupInfo);
siStartupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_FORCEOFFFEEDBACK | STARTF_USESTDHANDLES;
siStartupInfo.wShowWindow = SW_HIDE;
if(CreateProcess(MyApplication, "", 0, 0, FALSE, 0, 0, 0, &siStartupInfo, &piProcessInfo) == FALSE)
{
// blah
return 0;
}
新しいプログラムを開くと、メインアプリケーション(このコードを呼び出しているアプリケーション)ウィンドウ以外のすべてが正しく機能します。 新しいプロセスの優先度を下げようとしましたが、フォーカスの問題はまだあります。
とにかくこれを回避する方法はありますか?さらに、CreateProcess(またはShellExecuteなどのCreateProcessを呼び出すAPIのいずれか)を使用せずに別のプロセスを作成する方法はありますか?
アプリが新しいプロセスに与えられたため、隠されていてもアプリがフォーカスを失っていると推測します。
確かに通常の「なぜこれをしたいのか」と尋ねる好奇心のある人たちへの私の答えは、サービスになれないウォッチドッグプロセスがあり、メインを開くたびに開始されるからです応用。満足しましたか?
助けてくれてありがとう。コードは大歓迎です。 ジェス。
解決
実行中のアプリケーションはウィンドウフォーカスを取得しています。
この問題を回避する1つの方法は、新しいデスクトップで新しいプロセスを開始することです。これにより、アプリケーションがデスクトップ上のウィンドウフォーカスを盗むのを防ぐことができます。
新しいデスクトップでプロセスを実行するコードは次のようになります。
HDESK hOld = GetThreadDesktop( GetCurrentThreadId() );
HDESK hNew = OpenDesktop( "name", 0, FALSE, GENERIC_ALL );
SetThreadDesktop( hNew );
CreateProcess( ... );
SetThreadDesktop( hOld );
CloseDesktop( hNew );
他のヒント
明らかに、ターゲットアプリケーションはShowWindowフラグを尊重していません。起動されたアプリケーションを修正して、欲張りにならないようにする必要があります。
所属していません StackOverflow