Если вы хотите использовать «Ctrl + C» в родительском процессе (консоли) для завершения дочернего процесса, вы можете вызвать TerminateProcess
в функции обратного вызова процедуры обработчика:
#include <Windows.h>
#include <iostream>
PROCESS_INFORMATION pi = { 0 };
BOOL WINAPI CtrlHandler(DWORD fdwCtrlType)
{
switch (fdwCtrlType)
{
// Handle the CTRL-C signal.
case CTRL_C_EVENT:
printf("Ctrl-C event\n\n");
TerminateProcess(pi.hProcess, 0);
return TRUE;
default:
return FALSE;
}
}
int main()
{
STARTUPINFO si = { 0 };
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = true;
BOOL ret = CreateProcess("C:\\Windows\\System32\\mspaint.exe", NULL, NULL, NULL, false, 0, NULL, NULL, &si, &pi);
SetConsoleCtrlHandler(CtrlHandler, true);
WaitForSingleObject(pi.hProcess, -1);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
return 0;
}
Если вы хотите использовать «Ctrl + C» в дочернем процессе, вы можете отслеживать низкоуровневые события ввода с клавиатуры:
#include <Windows.h>
#include <iostream>
PROCESS_INFORMATION pi = { 0 };
HHOOK hook;
LRESULT CALLBACK LowLevelKeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
if (code == HC_ACTION)
{
PKBDLLHOOKSTRUCT pkb = (PKBDLLHOOKSTRUCT)lParam;
if (wParam == WM_KEYDOWN && pkb->vkCode == 'C')
{
if (GetAsyncKeyState(VK_CONTROL) < 0)
{
DWORD pid = 0;
HWND hwnd = GetForegroundWindow();
GetWindowThreadProcessId(hwnd, &pid);
if (pid == pi.dwProcessId)
{
TerminateProcess(pi.hProcess, 0);
PostQuitMessage(0);
}
}
}
}
return CallNextHookEx(hook, code, wParam, lParam);
}
int main()
{
STARTUPINFO si = { 0 };
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = true;
BOOL ret = CreateProcess("C:\\Windows\\System32\\mspaint.exe", NULL, NULL, NULL, false, 0, NULL, NULL, &si, &pi);
hook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, GetModuleHandle(NULL), 0);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
WaitForSingleObject(pi.hProcess,-1);
UnhookWindowsHookEx(hook);
printf("unhook\n");
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
return 0;
}