0

次のコードを使用して、メインウィンドウを非表示にしたアプリケーションを作成しています。

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)を使用せずに別のプロセスを作成する方法はありますか?

私の推測では、アプリが非表示になっている場合でも、新しいプロセスに割り当てられたため、アプリのフォーカスが失われています。

いつもの「なぜこれをやりたいのか」と確かに尋ねる興味のある方には、私の答えは、サービスにできないウォッチドッグプロセスがあり、メインアプリケーションを開くたびに開始されるためです。満足?

助けてくれてありがとう。コードをいただければ幸いです。ジェス。

4

2 に答える 2

0

明らかに、ターゲットアプリケーションはShowWindowフラグを尊重していません。起動したアプリケーションを修正して、貪欲にならないようにする必要があります。

于 2009-11-30T15:21:41.897 に答える
0

実行しているアプリケーションがウィンドウフォーカスを取得しています。

この問題を回避する1つの方法は、新しいデスクトップで新しいプロセスを開始することです。これにより、アプリケーションがデスクトップのウィンドウフォーカスを盗むのを防ぐことができます。

新しいデスクトップでプロセスを実行するためのコードは、次のようになります。

HDESK hOld = GetThreadDesktop( GetCurrentThreadId() );
HDESK hNew = OpenDesktop( "name", 0, FALSE, GENERIC_ALL );
SetThreadDesktop( hNew );
CreateProcess( ... );
SetThreadDesktop( hOld );
CloseDesktop( hNew );
于 2009-12-01T18:21:40.480 に答える