【问题标题】:How to Get the Main Window of a process(not the window handle)? [duplicate]如何获取进程的主窗口(不是窗口句柄)? [复制]
【发布时间】:2013-08-26 10:56:09
【问题描述】:

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

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

我浏览了 User32.dll 提供的大部分 API,但找不到我要找的东西。

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

在这方面的任何帮助将不胜感激:)

提前致谢。

【问题讨论】:

  • 您是想从同一个应用程序中还是从另一个应用程序中获取 MainWindow?
  • 您无法获得对驻留在不同进程中的窗口类实例的引用。您只能获取通过 Windows API 公开的窗口数据。更多需要 IPC,例如通过 Windows Communication Foundation。
  • @MatthewWatson。不仅。您也无法获得对驻留在同一进程中但在另一个 AppDomain 中的窗口类实例的引用。
  • @All 感谢您的回复。正如我所说,我已经浏览了几个链接,但从未在任何地方找到任何解决方案。让我告诉你我到底想要达到什么目的。我有一个 .exe 文件,它在一个环境中工作,而在另一个环境中不工作。尝试修复它,但没有运气。所以我想到了这种方式,因为让它工作不是我的首要任务。我只是想检查在进程中访问类是否会帮助我实现我想要的,因为它在以前的环境中工作。

标签: c# wpf windows


【解决方案1】:

您可以使用HwndSource.FromHwnd 方法。

这是一个简单的 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;
    }
}

【讨论】:

  • 我也试过这个选项,但 HWndSource.FromHwnd() 返回 null。我正在使用 Process.Start() 运行 .exe 文件,并使用 process.MainWindowHandle 获取窗口句柄。在此之后,如果我尝试按照您的建议进行操作,我会从该调用中得到 null。我错过了什么吗?
  • @Anee 您无法获得对驻留在另一个进程或另一个 AppDomain 中的窗口类实例的引用。
  • 我看了一段时间后才意识到这一点。但是我仍然想从某人那里听到它根本不可能,因为我不确定我是否错过了一些东西。无论如何,感谢您的所有回复。
猜你喜欢
  • 2010-12-25
  • 2011-04-12
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多