C++ MessageBox (Windows.h) - 它有啥作用以及如何使它不可见(或等效)?

Posted

技术标签:

【中文标题】C++ MessageBox (Windows.h) - 它有啥作用以及如何使它不可见(或等效)?【英文标题】:C++ MessageBox (Windows.h) - What does it do an how can I make it invisible (or equivalent)?C++ MessageBox (Windows.h) - 它有什么作用以及如何使它不可见(或等效)? 【发布时间】:2012-02-09 17:11:50 【问题描述】:

当我有:

MessageBox(NULL, NULL , "MessageBox", NULL);

出现一个消息框,我的程序按我的意愿运行,直到用户在消息框上单击“确定”,然后程序结束。我试图放入一个无限循环以获得相同的效果,但这与消息框的工作方式不同。我不想要消息框的原因是它阻碍了用户对程序的查看,如果他们试图关闭它,程序就会停止。所以我基本上只是想要一个不可见的消息框或具有相同效果的东西。

编辑:澄清一下,该程序是游戏的原型。我正在使用挂钩来查找用户正在按下的键。这是该程序的简化版本:

#define WM_KEYDOWN                      0x0100
#define _WIN32_WINNT 0x0500

#include <iostream>
#include <windows.h>
#include <winuser.h>

using namespace std;

LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)


PKBDLLHOOKSTRUCT keypointer = (PKBDLLHOOKSTRUCT)(lParam);
if (wParam==WM_KEYDOWN)

    switch(keypointer->vkCode)


        case VK_RIGHT:
            cout << "**RIGHT**";
            goto skip;
        case VK_LEFT:
            cout << "**LEFT**";
            goto skip;
        case VK_DOWN:
            cout << "**DOWN**";
            goto skip;
        case VK_UP: 
            cout << "**UP**";
        skip:
        default:
            cout << "";
    

return CallNextHookEx(NULL, nCode, wParam, lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) 


SetWindowsHookEx(WH_KEYBOARD_LL, HookProc, hInstance, 0);

MessageBox(NULL, NULL , "KLMBOX", NULL);

return 0;


我只希望程序具有相同的功能,但不显示消息框!我不是专家,我只是在胡闹:http://msdn.microsoft.com/en-us/library/windows/desktop/ms632589(v=vs.85).aspx

【问题讨论】:

你正在构建什么样的应用程序,因为你不应该需要一个消息框来保持应用程序的活动。 这听起来像是一个控制台应用程序,它输出大量数据然后MsgBoxs 并退出。要么让它成为一个 GUI 应用程序(带有一个 GUI),要么在最后添加一个“按任意键”提示。 @Deanna 查看我所做的编辑谢谢 :) @Dervall 查看我所做的编辑谢谢 :) ¤ MessageBox 调用正在运行一个消息循环,基本上是一个调用GetMessageTranslateMessageDispatchMessage 的循环。如果没有消息循环,则不会向您的钩子发送消息。但实际上你不应该使用钩子,而应该只使用你自己的窗口。您可以从my Windows API lessons blog 开始使用 Windows API 级编程。但这只是一个开始;你需要一些书,如果 Windows API 级别是你的选择,那么例如Petzold 的“编程窗口”。干杯&hth., 【参考方案1】:

听起来您正在寻找的是message loop。 MessageBox() 在这里做两件事:它显示对话框,但它还在内部提供自己的消息循环来处理对话框的输入。低级挂钩需要消息循环才能正常运行,而您的代码与 MessageBox 一起工作只是因为它提供的消息循环正在为您进行必要的消息处理。这就是为什么一个普通的无限循环不能作为替代品的原因——它没有适当地处理消息。

这是一个简单的,你可以剪切和粘贴:

MSG msg;
while(GetMessage(&msg, NULL, 0, 0))

    TranslateMessage(&msg);
    DispatchMessage(&msg);

当您在代码中的其他地方(但仍在同一个线程上)决定要退出时 - 也许当您检测到挂钩中的某些组合键时 - 使用 PostQuitMessage();这会将 WM_QUIT 消息发布到线程的队列中,当 GetMessage 检索到该消息时,它将返回 0 并退出循环。


说了这么多,首先这不是编写游戏的好方法;低级键盘钩子是矫枉过正的,在这里并不合适。如果您想在 Windows 应用程序中获取键盘输入,最简单的做法是创建您自己的窗口,它会在按键被按下/释放时收到 WM_KEYDOWN/UP 消息。

【讨论】:

【参考方案2】:

使用您的代码示例,您似乎正在尝试制作游戏,但结构完全错误。游戏通常有一个主循环,您在每次迭代中检查输入,更新游戏状态,然后进行渲染。如果这是您想要的,我建议您查看现有的众多开放游戏引擎之一,并尝试一些输入教程。 OGRE 3d 可能是一个很好的起点、良好的社区和良好的教程。

但是,如果这不是您想要的,并且您确实想玩钩子,您将需要创建一个不同的线程。如果您创建一个无限循环,系统将永远无法处理这些钩子。

可能最简单的方法是打开一个窗口并使其不可见。使用您现在正在使用的原始 win32 API 创建一个窗口是涉及到的,并且需要相当多的代码来完成。这是一个tutorial,它解释了所涉及的步骤。

但同样,如果您想制作一款简单的游戏,我建议您利用现有引擎。那样你会取得更快的进步。祝你好运!

【讨论】:

【参考方案3】:

我不明白...你想要一个消息框吗?如果不是,为什么要调用 MessageBox()?我相信消息框是模态的,这意味着用户必须以某种方式确认它(单击确定/取消),然后才能返回父界面。我相信它也是阻塞的,这意味着它不会在单独的线程上运行,并且会阻塞调用它的线程的执行,直到用户关闭它。

您的应用程序不应仅仅因为用户关闭了消息框而关闭,除非您是这样专门编写的。我需要更多信息和可能的代码示例来告诉你为什么会发生这种情况,如果它是无意的。

【讨论】:

哦我明白了,程序在消息框关闭后结束,因为在您显示消息框后没有更多指令。如果您希望应用程序继续运行,您不能让它结束,直到发生一些使其结束的事情......一种典型的方法是使用带有中断条件的无限循环。进行无限循环的最佳方法是使用 while(1)。当您希望程序结束时,请使用 break 指令来跳出无限的 while 循环......只需确保您在循环内执行操作,否则您的程序将只是看起来挂起。

以上是关于C++ MessageBox (Windows.h) - 它有啥作用以及如何使它不可见(或等效)?的主要内容,如果未能解决你的问题,请参考以下文章

c++ console application中要在MessageBox(NULL,"","提示信息",MB_OK);弹出数字怎么办

C++ Win32求解MessageBox消息对话框没法显示出来,但可以enter来控制

c++ console application中要在MessageBox(NULL,"","提示信息",MB_OK);弹出数字怎么办

关于提示框

windows.h有多有趣?(简略)

逆向工程修改MessageBox回显字符串