2013-08-26 102 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