0

Windows エクスプローラー ウィンドウを開き、5 秒間待ってからウィンドウを閉じるプログラムを作成したいと考えています。私は次のことを試しました:

#include "stdafx.h"
#include <windows.h>
#include <string>
#include <sstream>
#include <iostream>
using namespace std;

void _tmain( int argc, TCHAR *argv[] ) {

  STARTUPINFO si;
  PROCESS_INFORMATION pi;

  ZeroMemory( &si, sizeof(si) );
  si.cb = sizeof(si);
  ZeroMemory( &pi, sizeof(pi) );

  if( argc != 2 ) {
    cout << "Usage: " << argv[0] << "<path>";
    return;
  }

  // Build the command string.
  wstring app = L"explorer.exe ";
  wstring str_command = app + argv[1];
  wchar_t* command = const_cast<wchar_t*>( str_command.c_str() );

  // Open the window. 
  if( !CreateProcess( NULL,   // No module name (use command line)
      command,        // Command line
      NULL,           // Process handle not inheritable
      NULL,           // Thread handle not inheritable
      FALSE,          // Set handle inheritance to FALSE
      0,              // No creation flags
      NULL,           // Use parent's environment block
      NULL,           // Use parent's starting directory 
      &si,            // Pointer to STARTUPINFO structure
      &pi )           // Pointer to PROCESS_INFORMATION structure
  ) {
    cout << "CreateProcess failed: " << GetLastError();
    return;
  }

  cout  <<  "Opened window!" << endl;

  // Wait for it.
  Sleep(5000);

  cout  <<  "Done waiting. Closing... ";

  // Close explorer.
  HANDLE explorer = OpenProcess(PROCESS_TERMINATE, false, pi.dwProcessId);
  if( !explorer ) {
    cout << "OpenProcess failed: " << GetLastError();
    return;
  }
  if( !TerminateProcess( explorer, 0 ) ) {
    cout << "TerminateProcess failed: " << GetLastError();
    return;
  }

  // Close process and thread handles. 
  CloseHandle( explorer );
  CloseHandle( pi.hProcess );
  CloseHandle( pi.hThread );

  cout  <<  "Done.";
}

ちゃんと開くのですが、なかなか閉まりません。TerminateProcess はエラー コード 5 で失敗します。また、WM_CLOSE メッセージをウィンドウに投稿しようとしました。そこから成功値を取得しますが、ウィンドウは開いたままです。

助けてください!

4

1 に答える 1