前提
自アプリからCreateProcess関数で他アプリを起動し、自アプリの任意操作で起動した他アプリを閉じる機能を作ろうとしております。
他アプリは、PostMessage関数でWM_CLOSEを行うようにしようとしています。
試作実装
以下のような処理を実装し、動作を試してみました。
C++
1// ウィンドウハンドルを取得しアプリケーションを終了させる。 2BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM handle) 3{ 4 HANDLE h = (HANDLE)handle; 5 // ウインドウを作成したプロセスIDを取得。 6 DWORD lpdwProcessId = 0; 7 ::GetWindowThreadProcessId(hWnd, &lpdwProcessId); 8 DWORD lpdwProcessI = 0; 9 lpdwProcessI = ::GetProcessId(h); 10 11 // CreateProcessで起動したアプリのプロセスIDとメインウィンドウを 12 // 作成したプロセスIDが同じ場合、起動したアプリを終了させる。 13 if(lpdwProcessId == lpdwProcessI) 14 { 15 ::PostMessage(hWnd, WM_CLOSE, 0, 0); 16 return FALSE; 17 } 18 return TRUE; 19} 20 21int _tmain(int argc, _TCHAR* argv[]) 22{ 23 STARTUPINFO si; 24 PROCESS_INFORMATION pi; 25 ::ZeroMemory(&si, sizeof(STARTUPINFO)); 26 si.cb = sizeof(STARTUPINFO); 27 si.dwFlags = STARTF_USESHOWWINDOW; 28 si.wShowWindow = SW_SHOWNORMAL; 29 30 TCHAR szCommandLine[] = _T("C:\Windows\System32\notepad.exe"); 31 32 ::CreateProcess(NULL, szCommandLine, NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi); 33 34 ::CloseHandle(pi.hThread); 35 36 // コールバック関数の呼び出し。 37 EnumWindows(EnumWindowsProc, (LPARAM)&pi.hProcess); 38 39 ::CloseHandle(pi.hProcess); 40}
質問
GetProcessId関数でプロセスIDが取得できません。取得値が0になってしまいます。
試作実装の処理では、GetProcessId関数でプロセスIDを取得することはできないのでしょうか。
補足①
PROCESS_INFORMATIONやプロセスIDではなく、HANDLEを使うことを考えました。
理由については以下になります。
・PROCESS_INFORMATIONは、使わないデータがある。
・プロセスIDは、自アプリ外でプロセス終了、実行された際に、同じプロセスIDが付いてしまうことを懸念。
補足②
将来的にEnumWindowsProcでは、プロセスIDの一致+HANDLEの終了コードチェックでまだ開いている場合に限り、PostMessageを実行する予定です。
開発環境
Visual Studio 2010
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/12 00:15