messagebox - Win32 MessageBox 不出现

标签 messagebox winapi

我遇到了一个奇怪的问题。我正在 VC++ 2008 中制作 Win32 应用程序,制作一个类来封装大部分工作,以便在调用 MessageBox 时轻松重复。 .消息框已创建(我认为),但除非我按下 Alt 键,否则不会显示!

究竟发生了什么:

  • 我运行程序
  • 按 Enter
  • 主窗口失去焦点
  • 当我单击主窗口时发出哔声,就好像存在模态 MessageBox
  • 要么按 Escape... 获得焦点,要么按 Alt 然后 MessageBox 出现并按下 alt 键(即菜单将下降)!!!!!!

  • 附言它工作正常,但突然发生了这种情况。我没有发现任何区别 - 我什至做了一个新项目!

    这应该是主程序:
    int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR    lpCmdLine, int       nCmdShow)
    {
        MSG msg;
        CWnd    cMainWindow(TEXT("DentoMan"), TEXT("Bejkoman")); // pass The class name and window name to the constructor
    
        cMainWindow.CreateDef(); //Create the Window
        while (GetMessage(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        return (int)msg.wParam;
    }
    

    虽然这是类文件
    CWnd::CWnd() {
    };
    
    CWnd::CWnd(LPTSTR lpszClassName, LPTSTR lpszWindowName) {
        CWnd::lpszClassName     = lpszClassName;
        CWnd::lpszWindowName    = lpszWindowName;
    };
    
    CWnd::~CWnd() {
    };
    
    // Create the window with default parameters
    HWND CWnd::CreateDef(void) {
        WNDCLASSEX wcex;
    
        wcex.cbSize = sizeof(WNDCLASSEX);
    
        wcex.style          = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc    = StaticWndProc;
        wcex.cbClsExtra     = 0;
        wcex.cbWndExtra     = 0;
        wcex.hInstance      = (HINSTANCE)GetModuleHandle(NULL);
        wcex.hIcon          = 0;
        wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
        wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW + 4);
        wcex.lpszMenuName   = 0;
        wcex.lpszClassName  = lpszClassName;
        wcex.hIconSm        = 0;
    
        RegisterClassEx(&wcex);
        g_hWnd = CreateWindowEx(0,lpszClassName, lpszWindowName, WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, wcex.hInstance, this);
        hInst   =   wcex.hInstance;  //Store hInstance in the class hInst variable
    
        if (!g_hWnd) return false;
        ShowWindow(g_hWnd, SW_SHOW);
        UpdateWindow(g_hWnd);
    
        return g_hWnd;
    }
    
    LRESULT CALLBACK CWnd::StaticWndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) {
        /* The Only Message we take here so we store the 'this' pointer within the window to identify messages 
        comming from it by the 'this' pointer*/
        if ( Message == WM_CREATE ) {
            SetWindowLong( hWnd, GWL_USERDATA, (LONG)((CREATESTRUCT FAR *)lParam)->lpCreateParams);
        }
    
        /* Store the window pointer in the class pointer we just created in order to run the right public WndPRoc */
        CWnd *Destination = (CWnd*)GetWindowLong( hWnd, GWL_USERDATA );
    
        // If the hWnd has a related class, pass it through
        if (Destination) {
            return Destination->WndProc( hWnd, Message, wParam, lParam );
        }
    
        // No destination found, defer to system...
        return DefWindowProc( hWnd, Message, wParam, lParam );
    };
    
    LRESULT CWnd::WndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) {
        // Determine message type
        switch (Message) {
            case WM_LBUTTONDOWN:
                {
                    /* this is a common trick for easy dragging of the window.this message fools windows telling that the user is
                     actually dragging the application caption bar.*/
                     SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION,NULL);
                    break;
                }
    
            /*case WM_CREATE:
                break;
        */
    
            case WM_CLOSE:
                PostQuitMessage(0);
                break;
    
            case WM_DESTROY:
                UnregisterClass(lpszClassName, hInst);
                PostQuitMessage(0);
                break;
    
            case WM_KEYDOWN:    //KeyBoard keys
                // Which key was pressed?
                switch (wParam) {
                    case VK_ESCAPE: //close through escape key
                        PostQuitMessage(0);
                        return 0;
                    case VK_RETURN:
                        MessageBox(hWnd, TEXT("DFGDGD"), TEXT("DFGDFG"), NULL);
                        return 0;
                } // End Switch
    
                break;
    
            case WM_COMMAND:
                /*switch(LOWORD(wParam))
            {
            }*/
            break;
    
            case WM_PAINT:
                break;
    
            default:
                return DefWindowProc(hWnd, Message, wParam, lParam);
    
        } // End Message Switch
    
    return 0;
    };
    

    类标题:
    class CWnd {
        public:
            CWnd();
            CWnd(LPTSTR lpszClassName, LPTSTR lpszWindowName);
            virtual ~CWnd();
            virtual HWND CreateDef(void);           // Create the window with default parameters
            virtual LRESULT     WndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam );
    
        private:
            static LRESULT CALLBACK StaticWndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam);
            HWND        g_hWnd;     //Global window handle for this window
            HINSTANCE   hInst;      //Global instance for this window
    
            LPTSTR          lpszClassName;
            LPTSTR          lpszWindowName;
    };
    

    附言我包含了所有需要的头文件,除了 MessageBox 外一切正常

    这也是 here 上代码的链接

    最佳答案

    Ohhhhhhh 终于我找到了这个问题的解决方案......为了让每个人都受益,这个问题在 WM_PAINT 消息中的 WndProc(.... EndPaint 起作用,因此一旦在其上绘制任何内容(包括该 MessageBox),程序就会进入卡住期,但它仅在我按 Alt 时显示,我认为因为在该步骤中将控制权转移到系统以显示系统菜单(我认为)

    解决方案要么删除 WM_PAINT 消息处理程序,要么添加正常的 BeginPaint 和 EndPaint 函数

    感谢所有传递我问题的人

    关于messagebox - Win32 MessageBox 不出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4299915/

    相关文章:

    c++ - 串口通讯初始化

    java - 如何在开始新 Activity 之前等待确定按钮

    windows - 在 python 上使用 ctypes 不显示多个消息框

    excel - Visual Basic Excel 宏 MessageBox.Show 引发 "Object Required"错误

    c# - 是否可以获取和修改文本框的标准系统上下文菜单?

    c++ - CRecordset::snapshot 在 VS2012 中不再起作用——有什么选择?

    c++ - 将标准输出重定向到编辑控件 (Win32)。马克二世

    winapi - 同一 DLL 在一个进程中加载​​两次

    wpf - 强制MessageBox在.net/WPF中的应用程序窗口顶部

    c# - System.Windows.MessageBox 在开始之前不会等待用户输入!