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
【问题讨论】:
你正在构建什么样的应用程序,因为你不应该需要一个消息框来保持应用程序的活动。 这听起来像是一个控制台应用程序,它输出大量数据然后MsgBox
s 并退出。要么让它成为一个 GUI 应用程序(带有一个 GUI),要么在最后添加一个“按任意键”提示。
@Deanna 查看我所做的编辑谢谢 :)
@Dervall 查看我所做的编辑谢谢 :)
¤ MessageBox
调用正在运行一个消息循环,基本上是一个调用GetMessage
、TranslateMessage
和DispatchMessage
的循环。如果没有消息循环,则不会向您的钩子发送消息。但实际上你不应该使用钩子,而应该只使用你自己的窗口。您可以从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);弹出数字怎么办