none
MessageBox后引起的问题 RRS feed

  • 问题

  • #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,就可以了。

    这是什么原因呢?


    2012年6月2日 16:47

答案

  • 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
    2012年6月4日 6:39

全部回复

  • 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
    2012年6月4日 6:39
  • if((GetKeyState(27) & 0x80) == 0x80)
    -->
    if(GetKeyState(27) & 0x80)

    是这个意思?


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2012年6月4日 13:20
    版主
  • 你好,我还没完全明白你的意思,假如把按下ESC中断换成按下其他键中断,一样不能够中断循环。有没什么办法可以解决的?

    2012年6月5日 14:24
  • 判断是否按下了ESC
    2012年6月5日 14:24