2013-08-26 61 views
2

我一直试图让我的过程的主窗口的引用相当长一段时间。我经历了很多网站寻找解决方案。但它看起来像每个人都提供了一个解决方案来获得窗口句柄,而不是窗口本身。如何获取进程的主窗口(而不是窗口句柄)?

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

我经历了User32.dll提供的大部分API,但找不到我在找的东西。

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

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

在此先感谢。

+3

你试图从在同一应用程序中获得的主窗口,或从其他应用程序? – dognose

+0

您从句柄中获取窗口:http://stackoverflow.com/questions/5822026/get-wpf-window-by-hwnd – CKII

+2

您无法获取对驻留在不同窗口类中的窗口类的实例的引用处理。您只能获取通过Windows API公开的窗口数据。任何更多需要IPC,例如通过Windows Communication Foundation。 –

回答

2

您可以使用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; 
    } 
} 
+0

我也试过这个选项,但是HWndSource.FromHwnd()返回null。我使用Process.Start()运行.exe文件,并使用process.MainWindowHandle获取Window句柄。在此之后,如果我尝试做你所建议的我从那个调用中得到空。我错过了什么吗? – Anee

+2

@Anee您无法获得驻留在另一个进程或另一个AppDomain中的窗口类的实例的引用。 – sloth

+0

我在四处寻找了一段时间后才意识到它。但是,我仍然想从某人那里听到它根本不可能的,因为我不确定我是否错过了一些东西。无论如何,谢谢你的回复。 – Anee