为什么有些控件没有窗口句柄?

时间:2011-06-15 15:05:51

标签: windows winapi button controls handle

我想得到一些控件的窗口句柄来做一些东西(需要一个句柄)。控件在不同的应用程序中。

奇怪的是;我发现许多控件没有窗口句柄,比如Windows资源管理器中工具栏(?)中的按钮。只是尝试获取文件夹/搜索/(等)按钮的句柄。它只给了我0。

那么..第一个问题:为什么有些控件没有窗口处理?他们心中不是所有的控制窗户吗? (只是谈论标准控件,就像我期望它们在Windows资源管理器中一样,在窗格等上没有任何自定义控件。)

这让我想到了第二个问题:如果无法掌握它们,如何使用它们(比如使用EnableWindow)?

非常感谢任何投入!

编辑(附加信息):

Windows资源管理器只是一个例子。我经常遇到这个问题 - 在另一个应用程序中(我真正感兴趣的是一个专有的应用程序)。我有“物理”控件(因为我可以获得这些控件的AutomationElement),但它们没有窗口句柄。此外,我试图发送一个消息(SendMessage)来获取按钮状态,试图找出它是否被推(它是一个标准按钮,似乎只通过该消息表现出这种行为 - 至少就此而言我已经看到了。此外,推送状态在该按钮上的持续时间可能比标准按钮上的要长很多,尽管Windows资源管理器按钮显示类似的行为,就像按钮式复选框一样,尽管它们是(推)按钮)。 SendMessage需要一个窗口句柄。

ToolBar是否以某种方式改变其子元素的行为?拿走他们的窗把手或类似的东西? (使用父句柄/控件ID进行标识??)但是如何在那些需要窗口句柄的控件上使用函数呢?

3 个答案:

答案 0 :(得分:7)

如果他们没有手柄,他们就不是真正的控制,他们只是看起来像控件。

但是,当然,Windows资源管理器中的工具栏按钮具有窗口句柄,它们是工具栏的一部分。使用toolbar manipulation functions与他们互动,而不是EnableWindow

或者,更好的是,将记录的API用于搜索等内容。逆向工程Windows资源管理器永远不会结束,对于任何人,尤其是那些可怜的Windows Shell团队来说都很好,因为某些开发人员认为API适用于其他所有人,所以他们背负着多年的向后兼容性攻击。无论你做什么工作,都很有可能在下一版Windows上破解。

答案 1 :(得分:3)

您正在谈论的控件正在使用ToolbarWindow32类。如果您想与它们进行交互,那么您需要使用toolbar control API /消息。例如,要启用按钮,您需要使用TB_ENABLEBUTTON

答案 2 :(得分:0)

您可以使用GDI,OpenGL或DirectX自行实现控件。在Mozilla Firefox上尝试Window Detective,您将看到只有一个窗口。对话框中的控件不是Windows已知的窗口。