Reu*_*vis 2 c++ winapi invisible messagebox
当我有:
MessageBox(NULL, NULL , "MessageBox", NULL);
Run Code Online (Sandbox Code Playgroud)
出现一个消息框,我的程序按照我的要求工作,直到用户在消息框上单击"确定"然后程序结束.我尝试使用无限循环来产生相同的效果,但这与消息框的工作方式不同.我不想要消息框的原因是它阻碍了用户对程序的看法,如果他们试图关闭它,那么程序就会停止.所以我基本上只想要一个隐形的消息框或具有相同效果的东西.
编辑:澄清一下,该程序是游戏的原型.我正在使用钩子来查找用户按下的键.这是该程序的简化版本:
#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;
}
Run Code Online (Sandbox Code Playgroud)
我只是希望程序具有相同的功能,但不显示消息框!我不是专家,我只是瞎搞有: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);
}
Run Code Online (Sandbox Code Playgroud)
当您在代码中的其他地方(但仍然在同一个线程上)决定要退出时 - 也许当您在钩子中检测到某个键组合时 - 使用PostQuitMessage() ; 这会将WM_QUIT消息发送到线程的队列,当GetMessage检索到它时,它将返回0并且循环将退出.
说完这一切之后,这不是一个写游戏的好方法; 低级键盘挂钩是矫枉过正的,这里不太合适.如果你想在Windows应用程序中获得键盘输入,最简单的方法是创建自己的窗口,当按下/释放键时它将收到WM_KEYDOWN/UP消息.