我在想是否有相同值的句柄?
为了澄清我的问题,让我们说我打开记事本,键入一些文本,保存然后关闭记事本。如果我重复这一千次(甚至更多次),我是否有机会看到第一次使用的记事本主窗口使用相同的窗口句柄(HWND)值?如果是这样,为什么?
答案 0 :(得分:6)
是。句柄可以表示的值只有有限数量,因此Windows必须最终重用它们。
一旦手柄关闭,它就会消失,你不能用它做任何事情,它不存在,你甚至不应该看它。
如果您随后打开另一个句柄,那么Windows可能会重用该句柄值。
答案 1 :(得分:2)
pigeonhole principal,是的,它们不可能是唯一的。实际上,Microsoft仍然保持与16位Windows的兼容性,因此句柄是16位值。因此,最多有65536个可能的句柄值。
答案 2 :(得分:2)
我建议你不要对句柄值做任何假设。
您不应该为所有实际目的考虑具体的句柄值。句柄应被视为其他内容的不透明占位符。您可以传递句柄来引用某些内容(例如窗口),而无需引用真实内容,但您不必查看句柄本身。它是一个数值的事实应该被视为一个实现细节,即。并不重要(除非你做某种低级系统编程)。
话虽这么说,我支持@ jalf的答案:处理价值可以重复使用。如果我必须对此做出任何假设,我会假设句柄值可以随时重复使用。
答案 3 :(得分:2)
理论上是的。在实践中 - 发生这种情况的概率(与经常重用的进程和线程 id 相比)几乎为零。
在当前实现中,HWND
的低 16 位用作 Windows 句柄表中的索引 - 因此当前最多可以创建 64K 个窗口。接下来的 16 位用作重用索引。第一次使用单元格时,该索引为 1。重复使用该单元格时,该索引增加 1。依此类推。因此,在窗口上获得相同的 HWND
需要如何创建和销毁最少 64k 个窗口。但这只是在所有这些窗口都将使用同一个单元格的情况下。但我们有 64k 个单元格。所以真正的最小值要高得多。不完全是 2^32 但足够大。
即使实施会发生变化,我认为新实施不会使 HWND
不如当前独特。
答案 4 :(得分:1)
是的,窗口句柄可以重复使用。
IsWindow
function的文档说:
线程不应该将
IsWindow
用于它未创建的窗口,因为在调用此函数后窗口可能会被销毁。此外,由于窗口句柄被回收,句柄甚至可以指向不同的窗口。