0

exe から別のプログラムを呼び出そうとしていますが、バックグラウンドでサイレントに実行したいと考えています。(この呼び出しは非常に頻繁に発生するため、ウィンドウのポップアップは受け入れられません。)

それを行う5月の方法はこれです:

STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
ZeroMemory( &pi, sizeof(pi) );
if (!CreateProcess(NULL, cl, NULL, NULL, FALSE, 
                   CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) return -1;
else
{
  WaitForSingleObject( pi.hProcess, INFINITE );
  CloseHandle( pi.hProcess );
  CloseHandle( pi.hThread );
  return 0;
}

プロセスが作成され、目的のプログラムが実行されますが、残念ながら、CREATE_NO_WINDOWおよびSW_HIDEフラグにもかかわらずウィンドウが表示されます。私は何かを見逃していますか/何か間違っていますか?

私は行くことができるかもしれないと考えました

  1. を介してプロセスハンドルからプロセスIDを取得しますGetProcessId
  2. と を使用EnumWindowsGetWindowThreadProcessIdて、一致するウィンドウを見つけます
  3. 得られたを使用してHWND呼び出すShowWindowSW_HIDE

しかし、それは面倒なSW_HIDEので、とにかくプロセスを作成するときに「箱から出して」動作するはずです。

4

2 に答える 2

6

フィールドに指定した値は、新しく起動された関数wShowWindowのエントリ ポイントに渡されWinMainますが、これは参考にすぎません。ウィンドウを表示するかどうかは、完全に新しいプロセス次第です。

アプリのメイン ウィンドウを表示するときの標準/推奨動作は呼び出しShowWindow(hWnd, SW_SHOWNORMAL);でありSW_SHOWNORMAL、この例では「渡された値を使用する」ことを意味しますがWinMain、これを行うかどうかはプロセス次第です。

必要なものを得る 1 つの方法は、WH_CBTフックを使用することです ( のドキュメントを参照してくださいSetWindowsHookEx)。これにより、ウィンドウの作成をフックして画面外に再配置したり、表示を完全に停止したりできます。

于 2013-07-26T06:34:27.330 に答える
-3

CreateProcess +/- HCBT を使用して秘密裏にアプリケーションを起動する他の方法: ウィンドウ -> メッセージのみ、ウィンドウ -> WS_EX_LAYERED (アルファ = 0)、ウィンドウ -> NULLREGION、STATRTUPINFO.lpDesktop ...

于 2013-07-26T09:22:16.507 に答える