积极答复者
MessageBox后引起的问题

问题
-
#include <iostream> #include <Windows.h> using namespace std; int main() { MessageBox(GetConsoleWindow(),TEXT("Press ESC to break!"),TEXT("info"),MB_OK | MB_ICONINFORMATION); while(true) { if((GetKeyState(27) & 0x80) == 0x80) break; } cout<<"have breaked!"<<endl; system("pause"); return 0; }
我程序是控制台程序,想在后面的循环中,如果用户按下ESC,则中断循环。
可是,上面代码不能实现。如果我注释掉MessageBox,就可以了。
这是什么原因呢?
答案
-
paschen你好!
MessageBox函数会弹出一个模态对话框。模态对话框,也称模式对话框,是指在用户想要对对话框以外的应用程序进行操作时,必须首先对该对话框进行响应。如单击【确定】或【取消】按钮等将该对话框关闭。如果消息框有Cancel按钮的话,当按下ESC键或者选择Cancel按钮时,MessageBox函数就返回IDCANCEL。如果消息框没有Cancel按钮,按下ESC键没有任何影响。
当模态对话框弹出以后,如果我们直接按ESC键,那么循环还是可以被中断的。
如果我们点击“确定”或者“关闭”按钮关闭这个对话框以后,即使按下ESC键,GetKeyState函数值也不能指定ESC虚拟键的真实状态,这样if语句就不会为真,所以循环不能中断。
更多关于MessageBox函数和GetKeyState函数的信息,请参考下面的链接:
http://msdn.microsoft.com/zh-cn/library/ms645505.aspx。
http://msdn.microsoft.com/zh-cn/library/ms646301.aspx。希望我的回复对你有所帮助!
Helen Zhao [MSFT]
MSDN Community Support | Feedback to us
- 已标记为答案 Helen Zhao 2012年6月11日 3:07
全部回复
-
paschen你好!
MessageBox函数会弹出一个模态对话框。模态对话框,也称模式对话框,是指在用户想要对对话框以外的应用程序进行操作时,必须首先对该对话框进行响应。如单击【确定】或【取消】按钮等将该对话框关闭。如果消息框有Cancel按钮的话,当按下ESC键或者选择Cancel按钮时,MessageBox函数就返回IDCANCEL。如果消息框没有Cancel按钮,按下ESC键没有任何影响。
当模态对话框弹出以后,如果我们直接按ESC键,那么循环还是可以被中断的。
如果我们点击“确定”或者“关闭”按钮关闭这个对话框以后,即使按下ESC键,GetKeyState函数值也不能指定ESC虚拟键的真实状态,这样if语句就不会为真,所以循环不能中断。
更多关于MessageBox函数和GetKeyState函数的信息,请参考下面的链接:
http://msdn.microsoft.com/zh-cn/library/ms645505.aspx。
http://msdn.microsoft.com/zh-cn/library/ms646301.aspx。希望我的回复对你有所帮助!
Helen Zhao [MSFT]
MSDN Community Support | Feedback to us
- 已标记为答案 Helen Zhao 2012年6月11日 3:07