从Win32按钮调用时,MessageBox()返回0按

时间:2017-08-10 04:27:28

标签: c++ winforms winapi messagebox win32gui

我在Win32 GUI编程中只用了一周时间,所以我很自信/希望这很简单。为了您的考虑,我在下面提供了我的代码示例。

作为一个简短的简介,我的应用程序会监视另一个应用程序是否打开,以便我可以修改该应用程序的内存。我已将此初始检查放在我的UI looper顶部,如下所示,它只会运行一次(在这种情况下,用户只能取消并关闭应用程序,或者执行恢复超过if语句hWndApp指定了值):

if (!hWndApp) {
    appCheck();
}

如果我启动我的应用程序并且其他应用程序没有运行,则appCheck();会触发,并且执行的瀑布会相应地起作用:出现一个消息框(如果用户点击&#34,它将一直显示;重试")直到找到其他应用程序的窗口。如果用户点击"取消,"应用程序退出,一切都很好。如果他们点击"重试"一旦另一个应用程序运行,那么我的应用程序将完成绘画到屏幕并执行是正常的。

有趣的商家会在下次调用appCheck();时启动(当点击其中一个按钮时会发生这种情况)如果其他应用程序已打开,则关闭

在调试时(通过Visual Studio 2017),变量I将MessageBox()调用分配给其他应用程序打开时等于0,然后关闭,然后执行以下操作:

  1. 按下按钮可致电appCheck();
  2. 然后在getProcessHandleAndPID();语句中调用
  3. if,因为无法找到该窗口
  4. 然后在AppCheckMessageBox();循环中调用
  5. while,因为无法找到该窗口
  6. 调试器然后指向AppCheckMessageBox();内的第一行,这是整个int msgboxID = MessageBox();
  7. 按F11(Step Into),由于default的值为0(表示msgboxID,因此在触发switch语句中的MessageBox()选项后,没有显示窗口且应用程序存在呼叫失败,所以我尝试在GetLastError()之前调用exit(EXIT_FAILURE),但无济于事。)
  8. 我不确定我的错误在哪里,但我已经找到了许多解决方案 - 其中没有一个已经淘汰了。最后,如果你看到下面看起来错误或未声明的任何变量,那完全是由于我修改了这篇文章的代码以试图概括/缩短它。我可能遗漏了一些全局变量声明等等。

    感谢您提供的任何帮助/指导!我现在已经结束了这件事......哈哈。

    //--------------------------------------------------
    // Function to get process handle and PID of app  /
    //------------------------------------------------
    void getProcessHandleAndPID()
    {
        hWndApp = FindWindow(NULL, _T("NameOfApplication"));
    
        while (!hWndApp) {
            AppCheckMessageBox();
        }
        //Much more code here
    }
    
    //---------------------------------
    // Function to show message box  /
    //-------------------------------
    int AppCheckMessageBox()
    {
        int msgboxID = MessageBox(
            NULL, //I tried making this hWndApp as well, but no difference
            (LPCWSTR)L"Cancel to exit or start the app and click Retry.",
            (LPCWSTR)L"Application Not Found!",
            MB_ICONSTOP | MB_RETRYCANCEL | MB_SYSTEMMODAL | MB_SETFOREGROUND
        );
    
        switch (msgboxID)
        {
        case IDCANCEL:
            exit(EXIT_FAILURE);
        case IDRETRY:
            getProcessHandleAndPID();
            break;
        default:
            //GetLastError();
            exit(EXIT_FAILURE);
        }
    
        return msgboxID;
    }
    
    //------------------------------------------------
    // Function to check if application is running  /
    //----------------------------------------------
    void appCheck() {
        if (!FindWindow(NULL, _T("NameOfApplication"))) {
            getProcessHandleAndPID();
        }
    }
    
    //--------------------------------------------------
    // Function to get process handle and PID of app  /
    //------------------------------------------------
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        if (!hWndApp) {
            appCheck();
        }
    
        switch (message)
        {
        case WM_PAINT:
            //Code here
            break;
    
        case WM_CREATE:
            //Code here
            break;
    
        case WM_COMMAND:
            switch (HIWORD(wParam))
            {
                case BN_CLICKED:
                    if (LOWORD(wParam) == BTN_ENABLE) {
                        appCheck();
                    //Do stuff with button press
                }
                    if (LOWORD(wParam) == BTN_DISABLE) {
                        appCheck();
                    //Do stuff with button press
                }
                break;
            }
            break;
    
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
    
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
            break;
        }
    
        return 0;
    }
    

1 个答案:

答案 0 :(得分:0)

不是答案,但评论时间太长了:

  1. 这不是你真正的代码。许多东西都缺失了,有不匹配的大括号会阻止编译等。如果你需要帮助,请务必显示你的真实代码。
  2. 正如大卫所说,每次收到消息时都要调用appCheck()是错误的做法。如果您想在窗口打开后调用一次,请在进入消息循环之前执行此操作。
  3. 您的代码是不必要的递归(getProcessHandleAndPID()调用AppCheckMessageBox(),调用getProcessHandleAndPID()调用...)并可能导致堆栈溢出。
相关问题