C++MessageBox(Windows.h)-它做什么以及如何使它不可见(或等效)
C++ MessageBox (Windows.h) - What does it do an how can I make it invisible (or equivalent)?
当我有:
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
听起来您想要的是一个消息循环。MessageBox()
在这里做两件事:它显示对话框,但它也在内部提供自己的消息循环来处理对话框的输入。低级挂钩需要一个消息循环才能正常工作,而您的代码使用MessageBox只是因为它提供的消息循环正在为您进行必要的消息处理。这就是为什么普通的无限循环不能作为替代——它没有适当地处理消息。
这里有一个简单的可以剪切粘贴的:
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
当你在代码的其他地方(但仍然在同一个线程上)决定退出时——也许当你在钩子中检测到一些键组合时——使用PostQuitMessage();这将向线程的队列发布一条WM_QUIT消息,当GetMessage检索到该消息时,它将返回0,循环将退出。
话虽如此,但这并不是一个写游戏的好方法;低级键盘挂钩太夸张了,在这里并不合适。如果你想在windows应用程序中获得键盘输入,最简单的方法就是创建自己的窗口,当按下/释放键时,它会收到WM_KEYDOWN/UP消息。
使用您的代码示例,看起来您试图制作一个游戏,但结构完全错误。游戏通常有一个主循环,每次迭代都要检查输入,更新游戏状态,然后渲染。如果你想要的是这个,我建议你研究一下现有的许多开放游戏引擎中的一个,并尝试一些输入教程。OGRE3d可能是一个很好的起点,好的社区和好的教程。
然而,如果这不是你想要的,并且你确实想玩钩子,那么你需要创建一个不同的线程。如果您创建了一个无限循环,系统将永远无法处理钩子。
也许做你想做的事情最简单的方法就是打开一扇窗户,让它隐形。使用您现在正在使用的原始win32 API创建一个窗口涉及到这一点,并且需要相当多的代码。下面是一个教程,解释了所涉及的步骤。
但是,如果你想制作一款简单的游戏,我建议你利用现有的引擎。这样你会进步得更快。祝你好运
我不明白。。。你要不要留言箱?如果没有,为什么要调用MessageBox()?我相信消息框是模态的,这意味着用户必须以某种方式确认它(单击"确定"/"取消"),然后才能返回到父界面。我相信它也是阻塞的,这意味着它不会在单独的线程上运行,并且会阻塞被调用线程的执行,直到用户关闭它
你的应用程序不应该仅仅因为用户关闭了消息框就关闭,除非你是这样写的。我需要更多信息,可能还有代码示例来告诉你为什么会发生这种情况,如果这是无意的。
- 我如何使它,无论用户用空白字符串按 Enter 多少次,它总是打印"开始"字符串?
- 如何使它看起来像正在下的雪
- 为什么字符串流只读取整数中的第一个数字?如何使它只在空白处移动?
- 将 std::atomic_flag 包裹在吸气剂/二传手中会使它的"atomicity"无效吗?
- 从2011年开始,必须在2019年开始工作以使此Windows Textbox做出哪些更改
- 该代码不会在其中显示任何数字输入.如何使它显示任何输入
- 为什么输出是 2 而不是 7 ?+ 号如何使它与众不同
- 无论如何,是否可以使用setCursorPos(int,int)函数,但没有采用两个int使它需要速度较慢的两倍
- POD 类中的嵌套枚举是否使它不是 POD
- 多个线程同时在unordered_map中添加值会使它崩溃
- C++MessageBox(Windows.h)-它做什么以及如何使它不可见(或等效)
- 如何在c++ dll中实例化一个类,使它在函数调用之间保持内存
- 在QTableWidget中添加一个QPushButton到qtablewidgetiitem,如何使它Qt::Alig
- 延迟初始化缓存..我如何使它线程安全
- 如何修改一个类,使它只有一个成员函数,所有参数默认
- ' std::sort '在内部使用了什么魔法使它更快?
- 比较两个向量,使它更有效
- 我如何设置一个不断侦听循环与接收udp套接字,而不使它成为一个服务器
- Boost::process -如何使它只运行一个进程
- 我如何修复这段代码,使它不会pop_back或back()如果向量/堆栈是空的