C# 如何获取进程的主窗口(而不是窗口句柄)?

C# 如何获取进程的主窗口(而不是窗口句柄)?,c#,wpf,windows,C#,Wpf,Windows,一段时间以来,我一直在尝试获取进程主窗口的引用。我浏览了许多网站,寻找解决方案。但是看起来每个人都提供了一个解决方案来获取窗口句柄,而不是窗口本身 获取进程的主窗口句柄非常简单。我似乎也得到了预期的窗口标题 我浏览了User32.dll提供的大多数API,但找不到我想要的 我需要一个对窗口的引用,因为我想访问窗口类的几个成员来完成我的工作。我指的窗口是WPF窗口 我们将非常感谢您在这方面提供的任何帮助:) 提前感谢。您可以使用该方法 下面是一个简单的LinqPad就绪示例: void Main(

一段时间以来,我一直在尝试获取进程主窗口的引用。我浏览了许多网站,寻找解决方案。但是看起来每个人都提供了一个解决方案来获取窗口句柄,而不是窗口本身

获取进程的主窗口句柄非常简单。我似乎也得到了预期的窗口标题

我浏览了User32.dll提供的大多数API,但找不到我想要的

我需要一个对窗口的引用,因为我想访问窗口类的几个成员来完成我的工作。我指的窗口是WPF窗口

我们将非常感谢您在这方面提供的任何帮助:)

提前感谢。

您可以使用该方法

下面是一个简单的LinqPad就绪示例:

void Main()
{
    var mw = new MainW();
    mw.Show();

    var hWnd = FindWindowByCaption(IntPtr.Zero, "testwindow");
    var rootVisual = System.Windows.Interop.HwndSource.FromHwnd(hWnd).RootVisual;
    MainW m2 = (MainW)rootVisual;
    Thread.Sleep(500);
    m2.Title="is going";
    Thread.Sleep(500);
    m2.Title="to close...";
    Thread.Sleep(500);
    m2.Close();
}

[System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint="FindWindow", SetLastError = true)]
static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);

class MainW: System.Windows.Window
{
    public MainW()
    {
      Title = "testwindow";
      Width = 230;
      Height = 100;
      Background = System.Windows.Media.Brushes.AliceBlue;
    }
}

您是试图从同一应用程序中获取主窗口,还是从另一个应用程序中获取主窗口?您是从句柄获取窗口:无法获取对驻留在不同进程中的窗口类实例的引用。您只能获取通过Windows API公开的窗口数据。任何东西都需要IPC,比如通过Windows通信基金会。@ MatthewWatson。不仅如此。您也无法获取对驻留在同一进程但位于另一AppDomain中的窗口类实例的引用。@非常感谢您的回复。正如我所说,我已经通过了几个链接,但从未找到任何解决方案。让我告诉你我到底想要实现什么。我有一个.exe文件,它在一个环境中工作,而在另一个环境中不工作。我试着修好了,但运气不好。所以我想到了这个方法,因为让它工作并不是我的首要任务。我只是想检查访问进程中的类是否有助于实现我想要的目标,因为它在以前的环境中工作。我也尝试过这个选项,但HWndSource.FromHwnd()返回null。我使用Process.Start()运行.exe文件,并使用Process.MainWindowHandle获取窗口句柄。在此之后,如果我尝试执行您建议的操作,则从该调用中得到null。我遗漏了什么吗?@Anee您无法获取对驻留在另一个进程或另一个AppDomain中的窗口类实例的引用。我在四处查看了一段时间后才意识到这一点。但我还是想听到有人说这根本不可能,因为我不确定自己是否错过了什么。无论如何,谢谢你的回复。