在我当前的winforms项目中,我正试图使用SendMessage 在另一个应用程序的列表框中进行选择
我已成功找到正确的主窗口并向其发送命令。然而,我找不到控制列表框的句柄。
使用FindWindowEx函数或使用Winspy++,我只能获得包含多个列表框和几个按钮的窗口部分的句柄。
我该如何获得正确列表框的句柄,以便使用SendMessage和LB_SELITERANGEX来选择其中的某个项目?
提前感谢!
如果其他应用程序是用.NET编写的,那么这很可能是因为某些.NET System.Windows.Forms是以图形方式呈现的,而不是注册为实际的Windows控件。这最初是因为.NET窗体和Windows之间存在分歧,.NET试图提供当时Windows版本不支持的控制功能。现在,这种分歧似乎得以保留,只是因为这两个群体完全不相容,试图调和他们不值得付出代价,但这是否属实还有待观察。
请注意,自定义.NET控件不太可能理解LB_SELITEMRANGEX,即使您可以找到向其发送消息的方法。
我建议尝试找出您可以看到的Windows容器控件(包装在.NET Panel对象中的分组控件)是如何拥有子控件的,以证实或反驳这一理论,因为.NET可能会混淆控件层次结构,除了不同之外,没有任何明显的原因。尤其是当您在列表框周围单击时,要查看事件消息,以确定是否传递了正常的Windows控制消息。
如果这些是未注册为Windows控件的自定义.NET控件,则您的选项受到限制。NET主要依靠指向事件回调的指针来管理事件,而不是内置的Windows消息系统。每个运行的Windows应用程序的CLR实例是独立的。即使您可以获得一个指向Form对象的指针,也无法在应用程序之间使用它,因为它们不共享托管堆,甚至不共享虚拟内存空间。
如果您可以控制应用程序的开发,您可以添加外部可见的消息来帮助实现这一点,但我认为您不需要,因为如果您这样做了,就不需要发送这样的消息。如果特定控件有一个通过Windows消息传递系统的消息传递接口,那么您仍然可以确定要发送什么消息以及在哪里发送消息,这是可能的,因为这些控件中的大多数最初都是直接构建在Windows控件之上的,后来又出现了分歧。