3

我有一个小问题。我将首先向您展示一个示例,然后我会告诉您问题所在。

例子:

while(GetMessage(&msg, NULL, 0, 0)){
   TranslateMessage(&msg);
   DispatchMessage(&msg);
}

该示例正常工作,但如果“GetMessage”函数中的参数 2 更改为窗口的句柄名称,如下所示:

示例2:更改后

while(GetMessage(&msg, Hwnd, 0, 0)){
   TranslateMessage(&msg);
   DispatchMessage(&msg);
}

退出程序时会出现小问题。该程序仍然在进程列表中工作。并且需要选择它然后单击结束进程按钮来终止程序

现在,添加(NULL 或窗口句柄)之间有区别吗?

4

2 回答 2

5

您在第二个示例中遇到的问题是,在您的窗口被销毁后,您提供的窗口句柄GetMessage()不再有效。每个后续调用都会返回一个错误以通知您(使用GetLastError()give ERROR_INVALID_WINDOW_HANDLE),但代码不处理这种情况,因此永远处于忙碌循环中。

这就是为什么MSDN 库页面GetMessage()建议不要使用while (GetMessage(...)).

于 2012-05-11T16:09:36.643 回答
0

您提供的两个示例之间的根本区别在于您的应用程序如何处理消息。第一个示例将从消息队列中为您可能在应用程序中创建的任何窗口提取消息。后面的示例将仅从与传递给函数的句柄关联的窗口中提取消息。您可能会在应用程序中创建许多窗口。如果您只对捕获特定窗口的消息感兴趣,则该参数将用于限制被转换和分派到窗口过程函数的消息。但是,如果您计划只创建一个窗口,则差异可以忽略不计。

于 2012-05-11T15:59:43.563 回答