【发布时间】:2017-01-25 08:43:20
【问题描述】:
我正在编写的应用程序使用虚拟键盘。要显示、隐藏、调整大小或移动虚拟键盘,我首先需要通过调用FindWindow 函数来获取它的句柄,然后通过PostMessage 向它发送一些消息。
由于我没有使用 winapi 的经验,我的问题是我是否需要以某种方式释放此句柄,或者我可以在完成后忘记它吗?
虚拟键盘是一个独立的进程,其生命周期比我的应用程序更长。
【问题讨论】:
我正在编写的应用程序使用虚拟键盘。要显示、隐藏、调整大小或移动虚拟键盘,我首先需要通过调用FindWindow 函数来获取它的句柄,然后通过PostMessage 向它发送一些消息。
由于我没有使用 winapi 的经验,我的问题是我是否需要以某种方式释放此句柄,或者我可以在完成后忘记它吗?
虚拟键盘是一个独立的进程,其生命周期比我的应用程序更长。
【问题讨论】:
您不需要最终确定此句柄。它归创建窗口的进程所有,该进程也负责销毁它。
与内核句柄(文件句柄、事件句柄、互斥句柄等)不同,窗口句柄不计入引用计数。你调用FindWindow,然后用窗口句柄做需要做的事情,就可以了。
但是请注意,由于系统不会跟踪对窗口句柄的引用,因此如果窗口被销毁,那么您可以保留该被销毁窗口的句柄。如果系统重新使用该句柄,那么您现在就有了另一个窗口的句柄。
如果可能的话,当您以这种方式在多个进程之间协调用户界面时,您还应该传达窗口破坏事件,以避免一个进程持有过时的句柄。
【讨论】: