使用Winforms查找其他应用程序的ListBox的句柄

时间:2016-03-24 18:30:43

标签: c# handle sendmessage

在我目前的winforms项目中,我正在尝试使用SendMessage在另一个应用程序的列表框中进行选择

我成功找到了正确的主窗口并发送命令。但是,我无法找到控制列表框的句柄。

使用FindWindowEx函数或使用Winspy ++我只能获得一个窗口的一部分句柄,它包含多个列表框和几个按钮。

如何获得正确列表框的句柄,以便我可以使用SendMessage和LB_SELITEMRANGEEX来选择其中的某个项目?

提前致谢!

1 个答案:

答案 0 :(得分:0)

如果其他应用程序是用.NET编写的,那么这很可能是因为某些.NET System.Windows.Forms以图形方式呈现而不是注册为实际的Windows控件。这最初是因为.NET Forms和Windows之间存在分歧,.NET试图提供当时Windows版本不支持的控制功能。现在,这种分歧似乎只是因为这两个群体如此完全不相容而难以保持,以至于试图调和它们并不值得付出代价,但这是否真实还有待观察。

请注意,自定义.NET控件不太可能理解LB_SELITEMRANGEEX,即使您可以找到向其发送消息的方法。

我建议尝试找出子控件是如何由Windows容器控件所拥有的(包含在.NET Panel对象中的分组控件),以确认或驳斥这一理论,因为.NET可能会混淆除了不同之外没有明显原因的控制层次结构。特别是在单击列表框时查看事件消息,以确定是否正在传递正常的Windows控制消息。

如果这些是未注册为Windows控件的自定义.NET控件,则您的选项会受到限制。 .NET主要依靠指向事件回调的指针来管理事件,而不是内置的Windows消息系统。每个运行的Windows应用程序的CLR实例是独立的。即使您可以获得指向Form对象的指针,您也无法跨应用程序使用它,因为它们不共享托管堆甚至虚拟内存空间。

如果你可以控制应用程序的开发,你可以添加外部可见的消息来帮助解决这个问题,但我认为你不这样做,因为你不需要像这样发送这样的消息。如果特定控件具有通过Windows消息传递系统的消息传递接口,您可能仍然能够确定要发送的消息以及发送消息的位置,这是可能的,因为大多数控件最初都直接构建在顶部Windows控件,然后分歧。