1

我有一个简单的(Windows)应用程序,它使用 CreateProcess 函数启动另一个应用程序。然后它通过使用 EnumWindows 和新创建进程的进程 id 获得正确的 hwnd。

获得 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;
                }
            }
        }
    }
}
4

2 回答 2

5

你不能像这样拦截另一个消息循环。请记住,该进程将执行其自己的消息泵 - 您不能发送它的消息,我预计如果您这样做,事情会变得非常奇怪。

正确的方法是设置一个钩子。使用该SetWindowsHookEx功能在该窗口上安装挂钩。

于 2015-07-22T11:41:57.430 回答
0

PeekMessage仅从与其调用线程关联的消息队列中检索消息。Window,你试图查看的消息属于不同的线程,所以PeekMessage它的句柄永远不会给你任何东西。你可以安装一个钩子,或者子类化它的窗口过程。

于 2015-07-22T11:48:36.767 回答