我在想是否有相同值的句柄?
为了澄清我的问题,假设我打开记事本,输入一些文本,保存然后关闭记事本。如果我重复这一千次(甚至更多),我是否有机会看到第一次使用的记事本主窗口使用相同的窗口句柄 (HWND) 值?如果是这样,为什么?
我在想是否有相同值的句柄?
为了澄清我的问题,假设我打开记事本,输入一些文本,保存然后关闭记事本。如果我重复这一千次(甚至更多),我是否有机会看到第一次使用的记事本主窗口使用相同的窗口句柄 (HWND) 值?如果是这样,为什么?
是的。句柄只能表示有限数量的值,因此 Windows 最终必须重用它们。
一旦把手关闭,它就消失了,你不能用它做任何事情,它不存在,你甚至不应该看它。
如果您随后打开另一个句柄,那么 Windows 可能会重用该句柄值。
理论上是的。在实践中 - 这种概率(与经常重用的进程和线程 ID 相比)几乎为零。
在当前实现中,低 16 位HWND
用作 Windows 句柄表中的索引 - 因此目前最多可以创建 64K 个窗口。接下来的 16 位用作重用索引。当一个单元格第一次被使用时,这个索引是1。当这个单元格被重用时,索引增加1。等等。作为在窗口上获得相同结果的结果HWND
需要如何创建和销毁最小 64k 窗口。但这只是在所有这些窗口都将使用同一个单元格的情况下。但我们有 64k 个细胞。所以真正的最小值要高得多。不完全是 2^32 但足够大。
即使实施会改变,我认为新的实施不会HWND
比现在的独特。
根据鸽子原则,是的,它们不可能是唯一的。
由于与 32 位进程 (WoW64) 的兼容性,即使在 64 位操作系统上,句柄也不能使用整个 64 位——想想 64 位进程将句柄传递给 32 位子进程,或获取句柄到由 32 位进程打开的窗口。这使得它们的真实空间非常小,因此很有可能重复使用。
我建议您绝对不要对句柄值做出任何假设。
您不必出于所有实际目的考虑具体的句柄值。句柄应该被认为是其他东西的不透明占位符。您可以传递句柄来引用某些东西(例如窗口),而无需引用真实的东西,但您永远不必查看句柄本身。它是一个数值的事实应该被认为是一个实现细节,即。不重要(除非您可能进行某种低级系统编程)。
话虽如此,我支持@jalf 的回答:句柄值可以被重用。如果我必须对此做出任何假设,我会假设句柄值可以随时重用。