我有点问题。 我将首先向您展示一个例子,然后我将告诉您问题所在。
示例:
while(GetMessage(&msg, NULL, 0, 0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
该示例正常工作,但如果“GetMessage”函数中的参数2更改为窗口的句柄名称,则如下所示:
示例2:更改后
while(GetMessage(&msg, Hwnd, 0, 0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
退出程序时会出现一点问题。 程序仍在程序列表中运行。 并且需要选择它然后单击结束进程按钮以终止程序
现在,add(NULL或窗口句柄)之间有区别吗?
答案 0 :(得分:5)
在第二个示例中遇到的问题是,在窗口被销毁后,您提供给GetMessage()
的窗口句柄不再有效。每个后续调用都会返回一个错误通知您(GetLastError()
给出ERROR_INVALID_WINDOW_HANDLE
),但代码不处理这种情况,因此最终会在忙碌循环中结束。
这就是the MSDN Library page for GetMessage()
建议不要使用while (GetMessage(...))
。
答案 1 :(得分:0)
您提供的两个示例之间的根本区别在于您的应用程序如何处理消息。第一个示例将从您在应用程序中创建的任何窗口的消息队列中提取消息。后面的示例将仅从与传递给函数的句柄关联的窗口中提取消息。您可以在应用程序中创建许多窗口。如果您只对捕获特定窗口的消息感兴趣,那么该参数将用于限制已转换并分派到窗口过程函数的消息。但是,如果您打算只创建一个窗口,则差异可以忽略不计。