我有一个简单的(windows)应用程序,它使用CreateProcess函数启动另一个应用程序。然后通过使用EnumWindows和新创建的进程的进程ID获取正确的hwnd。
获得hwnd之后,我的应用程序的“主循环”开始了。此循环继续,直到CreateProcess启动的应用程序不再运行。
一切都运行良好,直到我尝试使用PeekMessage查看发送到我发起的应用程序的消息 - 似乎我的应用程序没有识别任何消息,但启动的程序(通过CreateProcess )正常运行,做它应该做的一切......
我想要实现的,是删除某些消息被发送到应用程序,主要是各种F键(F1,F2..F12键),但如果可能的话,我想更改菜单在应用程序中显示(我不知道我的意思是菜单的技术名称,它是你在右上角看到你点击应用程序图标的那个) - 我想添加一个小的'about'选项。
如果有人能够在我的代码中指出我做错了什么,或者为了阻止某些按键到达启动的应用程序更好的替代方案,我将非常感激。
非常感谢提前。 :)
以下是我目前的代码:
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;
}
}
}
}
}
答案 0 :(得分:5)
你不能拦截这样的另一个消息循环。请记住,这个过程将是自己的消息泵 - 你不能发送它的消息,我希望如果你这样做,事情就会变得非常奇怪。
正确的方法是设置一个钩子。使用SetWindowsHookEx
功能在该窗口上安装挂钩。
答案 1 :(得分:0)
PeekMessage
从消息队列中检索与其调用线程关联的消息 。窗口,您试图窥视的消息属于不同的线程,因此PeekMessage
及其句柄将永远不会给您任何东西。你可以安装一个钩子,或者subclass它的窗口程序。