【发布时间】:2016-09-06 19:54:58
【问题描述】:
我有以下功能:
Public Function CloseWindow(ByVal uHandle As Int32) As Boolean
Dim iRet As Integer = PostMessage(uHandle, WM_CLOSE, 0, 0)
Return CBool(iRet = 0)
End Function
运行时的函数是这样的:
Dim iRet As Integer = PostMessage(uHandle, WM_CLOSE, 0, 0)
If (iRet <> 0) Then
Dim iLastErr As Integer = Err.LastDllError()
'This always returns 0, so I don't know what to make up of it
Stop
End If
在某些情况下,iRet 返回 1。
谁能告诉我这可能意味着什么?
【问题讨论】:
-
PostMessage() 的返回类型是 Boolean,而不是 Integer。 1 只是另一种写 True 的方式。太好了,它没有失败,停止寻找不存在的问题。
-
您是否期望
PostMessage()像SendMessage()那样返回窗口过程返回的结果?这不可以。PostMessage()只是说“将此消息放入队列中,以便稍后运行;我现在还有其他事情要做”。不知道何时会处理该消息。您可以确定的是,GetMessage()将在未来的某个时候发布该消息。在处理消息时您可能已经存在,因此消息没有地方可以返回任何内容。因此,PostMessage()只返回成功/失败状态。 -
再次,documentation 告诉您仅在失败时调用 GetLastError(您在成功时调用它)。一旦我们处理完您成功的 API 调用,您是否也会提出一个真正的问题?
-
是的,我对此做出了回应。成功时不要致电
GetLastError。 -
将
WM_CLOSE发布到窗口是一个请求。可以拒绝该请求。PostMessage的返回值不会表明窗口是否被关闭/销毁。