メモ帳を起動してキー操作を送信する

メモ帳を起動してキー操作を送信するコードの例

//メモ帳を起動してC:\test.txtを開く
STARTUPINFO si = {};
si.cb = sizeof(si);
PROCESS_INFORMATION pi = {};
CreateProcess(NULL, L"notepad.exe C:\\test.txt", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);

//メモ帳が入力を待ち状態になるまで待機
WaitForInputIdle(pi.hProcess, INFINITE);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);

//デスクトップウィンドウのハンドルを取得
HWND hwnd = GetDesktopWindow();

//メモ帳のウィンドウハンドルを取得
hwnd = FindWindowEx(hwnd, NULL, L"Notepad", NULL);

//メモ帳をアクティブにする
SetForegroundWindow(hwnd);

//キー操作を送信する
keybd_event(VK_DOWN, 0, 0, 0);                //↓キー押す
keybd_event(VK_DOWN, 0, KEYEVENTF_KEYUP, 0);  //↓キー離す
keybd_event(VK_DOWN, 0, 0, 0);                //↓キー押す
keybd_event(VK_DOWN, 0, KEYEVENTF_KEYUP, 0);  //↓キー離す

メモ帳をアクティブにしたくない場合

//メモ帳を起動してC:\test.txtを開く
STARTUPINFO si = {};
si.cb = sizeof(si);
PROCESS_INFORMATION pi = {};
CreateProcess(NULL, L"notepad.exe C:\\test.txt", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);

//メモ帳が入力を待ち状態になるまで待機
WaitForInputIdle(pi.hProcess, INFINITE);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);

//デスクトップウィンドウのハンドルを取得
HWND hwnd = GetDesktopWindow();

//メモ帳のウィンドウハンドルを取得
hwnd = FindWindowEx(hwnd, NULL, L"Notepad", NULL);

//メモ帳のEditのハンドルを取得
hwnd = FindWindowEx(hwnd, NULL, L"Edit", NULL);

//キー操作を送信する
PostMessage(hwnd, WM_KEYDOWN, VK_DOWN, 0);  //↓キー
PostMessage(hwnd, WM_KEYDOWN, VK_DOWN, 0);  //↓キー

追記 keybd_event APIの使用例

/**
 * キーストロークを合成する
 * @param Key 入力するキーの仮想キーコード
 * @param Shift Alt、Ctrl、Shift キー、マウス ボタン、またはタッチ デバイスの状態
 * @param SpecialKey trueのときはスキャンコードにプリフィックスバイト 0xE0(224)を追加する
 */
void PostKey(Word Key, const TShiftState Shift, bool SpecialKey)
{
  if (Shift.Contains(ssCtrl)) { keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0); }
  if (Shift.Contains(ssShift)) { keybd_event(VK_SHIFT, MapVirtualKey(VK_SHIFT, 0), 0, 0); }
  if (Shift.Contains(ssAlt)) { keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), 0, 0); }

  DWORD flag = SpecialKey ? KEYEVENTF_EXTENDEDKEY : 0;
  keybd_event(Key, MapVirtualKey(Key, 0), flag, 0);
  flag = flag | KEYEVENTF_KEYUP;
  keybd_event(Key, MapVirtualKey(Key, 0), flag, 0);

  if (Shift.Contains(ssAlt)) { keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), KEYEVENTF_KEYUP, 0); }
  if (Shift.Contains(ssShift)) { keybd_event(VK_SHIFT, MapVirtualKey(VK_SHIFT, 0), KEYEVENTF_KEYUP, 0); }
  if (Shift.Contains(ssCtrl)) { keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0); }
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  //PrintScreenキーで全画面をキャプチャする
  PostKey(VK_SNAPSHOT, TShiftState(), false);

  //ALTキーとPrintScreenキーでフォーカスのあるウィンドウをキャプチャする
  PostKey(VK_SNAPSHOT, TShiftState() << ssAlt, false);

  //ALTキーとF4キーでアプリケーションを終了する
  PostKey(VK_F4, TShiftState() << ssAlt, false);
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください