質問

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

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フラグを尊重していません。起動されたアプリケーションを修正して、欲張りにならないようにする必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top