Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 窗口句柄(HWND)是唯一的,还是它们曾经被重用过?_Windows_Window Handles - Fatal编程技术网

Windows 窗口句柄(HWND)是唯一的,还是它们曾经被重用过?

Windows 窗口句柄(HWND)是唯一的,还是它们曾经被重用过?,windows,window-handles,Windows,Window Handles,我在想是否有相同值的句柄 为了澄清我的问题,假设我打开记事本,输入一些文本,保存它,然后关闭记事本。如果我重复一千次(甚至更多次),我会有机会看到记事本主窗口第一次使用的相同窗口句柄(HWND)值吗?如果是,原因是什么?是的。一个句柄只能表示有限数量的值,因此Windows最终必须重用这些值 一旦把手关闭,它就消失了,你不能用它做任何事情,它不存在,你甚至不应该看它 如果随后打开另一个句柄,则Windows可能会重用该句柄值。是的,它们不能是唯一的 由于与32位进程(WoW64)的兼容性,即使在

我在想是否有相同值的句柄


为了澄清我的问题,假设我打开记事本,输入一些文本,保存它,然后关闭记事本。如果我重复一千次(甚至更多次),我会有机会看到记事本主窗口第一次使用的相同窗口句柄(HWND)值吗?如果是,原因是什么?

是的。一个句柄只能表示有限数量的值,因此Windows最终必须重用这些值

一旦把手关闭,它就消失了,你不能用它做任何事情,它不存在,你甚至不应该看它

如果随后打开另一个句柄,则Windows可能会重用该句柄值。

是的,它们不能是唯一的


由于与32位进程(WoW64)的兼容性,即使在64位操作系统上,句柄也不能使用整个64位——想象一下,64位进程将句柄传递给32位子进程,或者获取由32位进程打开的窗口的句柄。这使得它们的真实空间非常小,因此很可能重复使用。

我建议您绝对不要假设句柄值

对于所有实际用途,您不必考虑具体的句柄值。句柄应被视为其他对象的不透明占位符。您可以传递句柄来引用某个对象(例如窗口),而不必引用真实对象,但您不必查看句柄本身。它是一个数值这一事实应该被视为一个实现细节,也就是说,不重要(除非你可能做一些低级的系统编程)


尽管如此,我还是支持@jalf的答案:句柄值可以被重用。如果我必须对此做出任何假设,我会假设句柄值可以随时重用。

是的,窗口句柄是重用的

文件说明:

线程不应将
IsWindow
用于它未创建的窗口,因为调用此函数后该窗口可能会被销毁。此外,由于窗口句柄是循环使用的,因此句柄甚至可以指向不同的窗口


理论上是的。在实践中,这种情况发生的概率(与经常重用的进程和线程id相反)几乎为零

在当前的实现中,
HWND
的低16位用作windows句柄表中的索引-因此当前最多可以创建64K个窗口。接下来的16位用作重用索引。第一次使用单元格时,此索引为1。重复使用此单元格时,索引增加1。等等因此,要在窗口上获得相同的
HWND
,需要如何创建和销毁至少64k个窗口。但这只是在所有这些窗口都将用于同一单元格的情况下。但我们有64k细胞。所以实际最小值要高得多。不完全是2^32,但足够大


即使实现会发生变化,我也不认为新的实现会使
HWND
不如当前的独特性。

我什么都不懂,你能解释一下你的问题吗???谢谢你的帖子,如果你不懂,没关系,请忽略并阅读人们的帖子,如果有任何有趣的想法,请阅读。我相信你很快就会上钩的:-D@Serious:“如果你不明白就好了”?!不,不是这样的:如果你在堆栈溢出问题上提出了一个好问题,这将为一个伟大的编程资源增加价值。如果您在堆栈溢出上发布了一个糟糕的或不可理解的问题,这实际上会损害堆栈溢出的有用性(即使只是一点点)。所以,为了社区的利益,请尽可能地表达你的问题!(顺便说一句,我已经编辑了你的问题)谢谢,有没有一种机制可以将手柄传递到打开的窗口?如果你可以分享,那是什么?我想知道是否有一种方法可以为每个打开的窗口传递句柄值?我不想得到那扇坏掉的窗户的把手。我对windows的了解不是很好,我会提出问题。没有-没有GUI句柄有参考计数器。所以只有一个句柄值,你不能像“DuplicateHandle”这样做,这是一个设计错误,就像UNIX使用进程id值一样。谢谢你,你的帖子和他的(ybungabol)非常有用。他先发帖,所以我认为他的答案是可以接受的。我的名声目前只有12岁,如果下次有机会再见面,我会投你一票。@认真的,不要说“竖起大拇指”(如ybungalobill的回答)或“非常有用”(如我的回答),只要按问题左侧的向上箭头就行了!您肯定应该假设句柄值可以重用。这不是一件“潜在”的事情。的文档明确指出:“线程不应将IsWindow用于它未创建的窗口,因为调用此函数后该窗口可能会被销毁。此外,由于窗口句柄是循环使用的,因此该句柄甚至可能指向其他窗口。”@Cody,你说得对,我可能太谨慎了。;-)我已经更新了我的答案。问题不是关于句柄的表示,而是关于句柄的生命周期。只有部分答案是正确的。窗口句柄不保留与16位窗口的兼容性。它们是指针,这意味着它们的大小取决于架构。在64位版本的Windows上,它们是64位值。在32位版本的Windows上,它们是32位值。有关详细信息,请检查Windows头文件。
句柄
类型不再是
void*
的typedef;这件事已经过去好几年了。从那以后,MSDN文档的部分内容显然没有更新过,但这并不能减少假设的不正确性。此外,这甚至不是你链接到的文章所说的。它只说每个会话有65536个用户句柄的限制。这并没有说明任何关于数据类型u的问题