我在思考是否存在相同值的句柄?
为了澄清我的问题,假设我打开记事本,输入一些文本,保存并关闭记事本。如果我重复这个过程一千次(甚至更多),我是否有机会看到用于记事本主窗口的相同窗口句柄(HWND)值被第一次使用? 如果是这样,为什么?
我在思考是否存在相同值的句柄?
为了澄清我的问题,假设我打开记事本,输入一些文本,保存并关闭记事本。如果我重复这个过程一千次(甚至更多),我是否有机会看到用于记事本主窗口的相同窗口句柄(HWND)值被第一次使用? 如果是这样,为什么?
HWND
的低16位用作Windows句柄表中的索引,因此当前最多可以创建64K个窗口。接下来的16位用作重用索引。当单元格第一次被使用时,该索引为1。当此单元格被重新使用时,索引增加1。结果是为了在窗口上获得相同的HWND
,需要创建并销毁至少64k个窗口。但这仅在所有这些窗口将使用相同的单元格的情况下成立。但我们有64k个单元格。所以实际最小值要高得多。不完全是2^32,但足够大。HWND
比当前更不唯一。IsWindow
函数的文档说明如下:
一个线程不应该对它没有创建的窗口使用
IsWindow
函数,因为在此函数调用后窗口可能已经被销毁。而且,由于窗口句柄会被回收,句柄甚至可能指向不同的窗口。
HANDLE
类型不再是 void*
的 typedef 了;已经过去了 很多年。显然 MSDN 文档的某些部分自那时以来就没有更新,但这并不能使假设变得更正确。此外,这甚至不是你链接的文章所说的。它只是说每个会话有 65,536 个用户句柄的限制。这并没有说明用于存储句柄的数据类型。你做出的结论既不是明确陈述的,也是不合理的。 - Cody GrayHWND
值无关。 - Cody GrayHANDLE
,而是 HWND
。我不明白为什么你还在谈论完全无关的事情,比如 GDI 句柄和 HANDLE
类型。问题标题非常清楚地说了“窗口句柄”。我并没有编造这个。而且我已经解释过,表格对这个讨论来说是相当无关紧要的。最后,我们进入了你的论点的核心,这完全是错误的。Win16 应用程序 无法在 64 位版本的 Windows 上运行。结束。 - Cody Graytypedef HANDLE HWND;
,typedef PVOID HANDLE;
,typedef void *PVOID;
。而User Objects
的文章提到了HWND
,而非GDI对象。 GDI对象
在导航中有一个单独的article列出。最后,还有一个关于句柄表的简要参考。 - Afriza N. Arief我建议您不要对句柄值做任何假设。
在实际应用中,您不应该考虑具体的句柄值。句柄应被视为其他东西的不透明占位符。您可以传递句柄以引用某些内容(例如窗口),而无需引用真正的内容,但您不应该查看句柄本身。它是一个数字值应被视为实现细节,即不重要(除非您进行某种低级系统编程)。
话虽如此,我支持@jalf的答案:句柄值可能会被重复使用。如果我必须对此做出任何假设,我会假设句柄值随时可能被重复使用。
IsWindow()
函数的文档明确指出: “线程不应使用IsWindow
来检查它没有创建的窗口,因为在调用此函数后窗口可能已经被销毁。此外,由于窗口句柄会被循环利用,所以句柄甚至可能指向不同的窗口。” - Cody Gray