2013-08-26 2 views
2

나는 나의 프로세스의 메인 윈도우에 대한 참조를 꽤 언젠가 얻으려고 노력해왔다. 나는 많은 사이트를 통해 해결책을 찾고 있었다. 그러나 모든 사람이 창 핸들이 아니라 창 자체를 가져 오는 솔루션을 제공하는 것처럼 보입니다.프로세스의 기본 창을 가져 오는 방법 (창 핸들이 아님)?

프로세스의 메인 윈도우 핸들을 얻는 것은 아주 간단합니다. 예상대로 Window 제목을 얻는 것 같습니다.

나는 User32.dll에서 제공하는 대부분의 API를 살펴 봤지만 찾고있는 것을 찾을 수 없었다.

내 작업을 수행하기 위해 창 클래스의 몇 가지 멤버에 액세스하려는 때문에 창에 대한 참조가 필요합니다. 내가 말하는 창은 WPF 창입니다.

이 점에있어서 도움이 될 것입니다 :

미리 감사드립니다.

+3

같은 응용 프로그램 내에서 MainWindow를 얻을려고, 또는 다른 응용 프로그램에서 있습니까 :

다음은 간단한 LinqPad 준비 예제? – dognose

+0

핸들에서 창을 가져옵니다. http://stackoverflow.com/questions/5822026/get-wpf-window-by-hwnd – CKII

+2

다른 클래스에있는 창 클래스의 인스턴스에 대한 참조를 가져올 수 없습니다. 방법. Windows API를 통해 노출 된 창 데이터에서만 가져올 수 있습니다. Windows Communication Foundation과 같은 IPC가 필요합니다. –

답변

2

HwndSource.FromHwnd 메서드를 사용할 수 있습니다.

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 사용하여 창 핸들을 가져옵니다. 이것 후에 당신이 제안한 것을하려고하면 그 호출에서 null이 생깁니다. 내가 놓친 게 있니? – Anee

+2

@Anee 다른 프로세스 또는 다른 AppDomain에있는 창 클래스의 인스턴스에 대한 참조를 가져올 수 없습니다. – sloth

+0

언젠가 주위를 둘러 본 후에 나는 그것을 깨달았습니다. 그러나 나는 누군가에게서 뭔가를 듣고 싶었습니다. 왜냐하면 나는 뭔가를 놓쳤다는 것을 확신하지 못했기 때문에 전혀 그럴 수 없었습니다. 어쨌든 모든 답장을 보내 주셔서 감사합니다. – Anee

관련 문제