Запуск приложения через CreateProcess, но PeekMessage не может показаться?

У меня есть простое (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;
}
}
}
}
}

1

Решение

Вы не можете перехватить другой цикл сообщений, как это. Помните, что этот процесс будет иметь свою собственную рассылку сообщений — вы не можете отправлять его сообщения, и я ожидаю, что если вы это сделаете, все будет очень странно.

Правильный способ — установить крючок. Использовать SetWindowsHookEx функция, чтобы установить крюк в этом окне.

5

Другие решения

PeekMessage извлекает сообщения только из очереди сообщений, связанной с ее вызывающим потоком. Окно, сообщения которого вы пытаетесь просмотреть, принадлежит другому потоку, поэтому PeekMessage с его ручкой никогда не даст вам ничего. Вы можете либо установить крючок, либо подкласс его оконная процедура.

0

По вопросам рекламы [email protected]