У меня есть простое приложение (Windows), которое запускает другое приложение с помощью функции CreateProcess. Затем он получает правильный hwnd, используя EnumWindows и идентификатор вновь созданного процесса.
После получения hwnd начинается «основной цикл» моих приложений. Этот цикл продолжается до тех пор, пока приложение, запущенное CreateProcess, не перестанет работать.
Все работает отлично, пока я не попытаюсь использовать PeekMessage для просмотра сообщений, отправляемых в приложение, которое я запустил. Кажется, что мое приложение вообще не распознает сообщения, но запущенная программа (через CreateProcess) работает. как обычно, делаю все, что надо ..
То, что я пытаюсь достичь, - это удалить определенные сообщения из отправки в приложение, в основном различные F-клавиши (клавиши F1, F2..F12), но также, если возможно, я хотел бы изменить меню, показанное в приложение (я не знаю технического названия для меню, я имею в виду, это то, что вы видите, что вы нажимаете на значок приложения в правом верхнем углу) - я хочу добавить небольшую опцию «о».
Если бы кто-нибудь мог указать на то, что я делаю неправильно в своем коде, или на лучшую альтернативу для предотвращения попадания определенных нажатий клавиш в запущенное приложение, я был бы очень благодарен.
Спасибо заранее. :)
Вот код, который у меня сейчас есть:
VOID PerformLaunch(LPWSTR lpAppName, LPTSTR lpCmdLine) {
STARTUPINFO si;
PROCESS_INFORMATION pi;
DWORD dwLoopExitCode = NULL;
BOOL cpBool = FALSE;
BOOL finishedLoop = FALSE;
MSG message = { 0 };
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
cpBool = CreateProcess(lpAppName, lpCmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
if (!cpBool) {
MessageBox(Game_HWND, L"Could not start process!", L"Error:", MB_OK | MB_ICONERROR);
}
//-- Enumerate windows until Game_HWND && Game_Hook are not NULL.
while (Game_Hook == NULL) {
EnumWindows(MainEnumGameWindProc, pi.dwProcessId);
}
while (!finishedLoop) {
DWORD dwWC = WaitForSingleObject(pi.hProcess, 0);
if ((dwWC == WAIT_FAILED) || (dwWC == WAIT_OBJECT_0)|| (dwWC == WAIT_ABANDONED)) {
DWORD dwExitCode;
GetExitCodeProcess(pi.hProcess, &dwExitCode);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
dwLoopExitCode = dwExitCode;
finishedLoop = TRUE;
}
else {
if (PeekMessage(&message, Game_HWND, 0, 0, PM_REMOVE)) {
TranslateMessage(&message);
DispatchMessage(&message);
if (WM_QUIT == message.message) {
finishedLoop = TRUE;
break;
}
}
}
}
}