C++MessageBox(Windows.h)-它做什么以及如何使它不可见(或等效)

C++ MessageBox (Windows.h) - What does it do an how can I make it invisible (or equivalent)?

本文关键字:何使它 Windows C++MessageBox 什么      更新时间:2023-10-16

当我有:

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()?我相信消息框是模态的,这意味着用户必须以某种方式确认它(单击"确定"/"取消"),然后才能返回到父界面。我相信它也是阻塞的,这意味着它不会在单独的线程上运行,并且会阻塞被调用线程的执行,直到用户关闭它

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

相关文章: