为什么Control.FromHandle(IntPtr)在一个挂钩进程中返回null;形式";?在另一个挂钩过
本文关键字:形式 Control quot 另一个 null 一个 FromHandle 为什么 IntPtr 进程 返回 | 更新日期: 2023-09-27 18:00:31
我面临一个问题,该问题与从某个挂接的进程中取出所有控件有关。我的SpyDll成功启动到挂钩进程,但当我检查语句时
Control Control=Control.FromHandle(MainWindowHandle),它将null返回到控制对象中,其中"MainWindowHandle"只是该挂接进程的本机主窗口句柄,您在启动该进程后总是从.NET"process"类中获取该句柄。
但奇怪的是,在同一个C#.NET应用程序的其他挂钩进程中,它返回了Main"WinForm"的有效对象。
那个么,为什么在上述情况下它不起作用呢?正确使用"MainWindowHandle"是否有任何例外。在我的例子中,两者都是用C#编程的独立的.NET管理进程。在创建流程时,是否有任何流程配置需要专门维护?
问候Usman
当您使用WinForms创建Control/Form时,WinForm代码将自动保留一个将本机窗口句柄映射到C#实例的条目。当控制/表格被销毁时,该条目将被删除。因此,调用Control.FromChildHandle所做的就是搜索条目列表,看看它是否有匹配的本地句柄,如果有,则返回关联的C#实例。
因此,您将只返回从WinForms本身创建的Control/Form实例的C#条目。附加到另一个进程的本机窗口和本机控件永远不会返回条目。这就是为什么is对你不起作用,也永远不会起作用,也是为什么你在使用使用WinForms创建窗口的C#应用程序时会得到一个有效的类。
这是因为您正在调用的函数"Control.FromHandle"使用哈希表从其句柄中查找控件实例。因此,当您为没有控件实例的HWND调用此方法时,您将得到null。
要使用HWND,您应该通过PInvoke调用使用Win32消息API。例如,可以使用SendMessage发送WM_GETTEXT消息来查询窗口的文本。对于其中的一些消息,Win32 Windowing API中有各种包装器,如GetWindowText,用于包装上面的消息。
1.)请记住,可能存在多个应用程序域,并且在当前进程中只能获取当前应用程序域的控制对象。你也必须使用正确的ruuntime版本afaik,但我不确定。
2.)为什么你想要控制句柄,不管怎样,直接使用本机句柄要方便得多,你甚至可以在另一个进程中使用本机函数,而不需要dll注入。如果您确实需要托管控件对象,请检查Application.OpenForms集合,而不是句柄搜索!
您是否研究过使用Control.FromChildHandle?它将搜索控制链,直到找到与该句柄关联的控件。
在第一种情况下,它可能不是直系后裔。
对于任何给定的AppDomain,T类型的非静态成员都生活在一个实体(T的实例)中。T类型的静态成员生活在另一个单独的实体(T类型本身)中。因此,一个AppDomain中的T的类型或实例与另一个AppDomain中的T类型或实例是不同的。这意味着Control.FromHandle只有在返回的实例与调用方法位于同一AppDomain中时才有意义,否则它必须返回null。
要使用另一个AppDomain,您需要一些COM风格的编码,比如(psuedocode):
runtimes = IClrMetaHost.EnumerateLoadedRuntimes(processHandle);
host = runtime[0].GetInterface( ICorRuntimeHost );
appdomains = host.EnumDomains();
appdomains[0].CallBack( () => dosomething(); );