C# 从窗口句柄获取窗口实例
我可以通过使用以下代码运行应用程序来获取窗口句柄C# 从窗口句柄获取窗口实例,c#,.net,wpf,C#,.net,Wpf,我可以通过使用以下代码运行应用程序来获取窗口句柄 foreach (ProcessModule module in process.Modules) { if (module.ModuleName.Contains("PresentationFramework.dll") || module.ModuleName.Contains("PresentationFramework.ni.dll")) { IntPtr window = process.MainWindowHandle
foreach (ProcessModule module in process.Modules)
{
if (module.ModuleName.Contains("PresentationFramework.dll") || module.ModuleName.Contains("PresentationFramework.ni.dll"))
{
IntPtr window = process.MainWindowHandle;
}
}
但是我想从这个处理程序中获取窗口实例。可能吗
有什么好主意吗?试试以下方法:
IntPtr handle = process.MainWindowHandle;
HwndSource hwndSource = HwndSource.FromHwnd(handle);
Window = hwndSource.RootVisual as Window;
更新:
但这只能在同一个AppDomain中工作,因为否则就意味着可以在不同的AppDomain甚至进程之间共享对象,这显然是不可能的 在WPF应用程序(或WinForms)中,“窗口”有两个“对象”(即包含信息的内存块):
(1) 虽然可以读取另一个进程的原始内存,但托管堆上的对象是移动目标。即使您可以以某种方式挂起该进程的垃圾收集线程,也无法找到它们。您是指窗口句柄吗?(不带“r”)是否正在查找实际的.NET对象?无法在另一个进程中从HWND获取System.Windows.Window。尽管如此,你想做什么?也许有一些方法可以完成你最终想要做的事情,这很有效。但仅适用于当前应用程序。我可以获取当前WPF应用程序的窗口。其他人抛出NRE异常。HwndSource返回null。任何其他帮助。@Jawahar-无法从当前AppDoAdmin/进程外部访问对象(不使用远程处理)。请参阅我的更新。是否有其他类似于使用非托管代码的方法,例如使用user32.dll。@Jawahar-这是一个概念性问题,不特定于.NET。不能跨进程共享相同的对象。假设您从另一个进程获得了一个窗口实例。现在问问自己,如果更改此窗口的某些属性(例如位置),会发生什么情况?如果可能的话,那么任何程序都可以操纵任何其他程序的窗口……有人知道如何做相反的事情吗?我需要从现有的窗口对象中获取IntPtr句柄。+1表示“永远都找不到”的“移动目标”!(这门语言总体上非常丰富多彩,但这门语言赢得了我的好感)