【问题标题】:PostMessage WM_CLOSE returns 1 [closed]PostMessage WM_CLOSE 返回 1 [关闭]
【发布时间】: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 的返回值不会表明窗口是否被关闭/销毁。

标签: vb.net winapi


【解决方案1】:

WM_CLOSE已发送消息,而不是已发布消息。 张贴消息不能返回值给发帖者。

PostMessage() 的返回值是一个BOOL,它只是表示消息是否成功添加到窗口的消息队列中,而不是消息是否被实际处理。

如果您需要处理WM_CLOSE返回的LRESULT值来指示关闭是接受还是拒绝,您需要使用SendMessage()(或相关函数)而不是PostMessage()

如果窗口由发送WM_CLOSE 的线程拥有,您可以使用DestroyWindow() 来实际关闭它(除非它的窗口过程将WM_CLOSE 消息传递给DefWindowProc(),在这种情况下它将调用DestroyWindow() 给你)。但是,如果窗口由另一个线程拥有,您所能做的就是发送WM_CLOSE 要求它自行关闭。

【讨论】:

  • 非常感谢!
  • 请注意,您不能DestroyWindow() 到外部窗口。如果窗口是外国的,WM_CLOSE 就是你所拥有的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多