2012-09-26 1 views
1

저는 C# Windows 응용 프로그램을 가지고 있으며 궁극적으로 interop 구성 요소의 대화 상자를 시작합니다. 문제는이 대화 상자 창이 C# 응용 프로그램의 기본 창 뒤에 표시되어 사용자가 alt-tab을 눌러야 찾을 수 있다는 것입니다.C# 창 핸들에서 부모 프로세스 가져 오기

나는이 대화 상자 창을 찾아 오도록 위치에 조치를 넣었습니다

...

private static extern bool SetForegroundWindow(IntPtr hWnd); 

public class SearchData 
{ 
    public string Wndclass; 
    public string Title; 
    public IntPtr hWnd; 
} 

private static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, ref SearchData data); 
private delegate bool EnumWindowsProc(IntPtr hWnd, ref SearchData data); 

public static bool EnumProc(IntPtr hWnd, ref SearchData data) 
{ 
    //Code to determine whether the window from handle hWnd is our target window. 
    //apply handle, title, class to data and halt the enumeration 
} 

...하지만 '발견'대화는 대화 상자의 클래스 이름과 형태로 제목 변경과 같은 문제가있다.

그러나 대화 상자 창의 상위 프로세스 (작업 관리자> 프로세스로 이동)는 현재 프로세스와 동일합니다. 그래서이 대화 상자 창을 정확하게 '찾기'위해서 모든 창을 열거하고 부모 processID를 찾고 CurrentProcess와 비교하는 것이 목표입니다.

창 핸들에서 전체 상위 프로세스를 가져 오는 방법이 있습니까?

답변

1

GetWindowThreadProccessId이 작업을 수행합니다.

+0

훌륭합니다, 감사합니다. 이 답변과이 게시물 (http://stackoverflow.com/questions/2281429/how-to-enumerate-all-windows-within-a-process)을 통해 해결책을 얻었습니다. – MoSlo

0

대화 상자를 열기 전에 응용 프로그램 창을 숨겨보십시오. 그런 식으로 그것 뒤에 나타나지 않을 것입니다.

+0

대화 상자가 다른 창 뒤에 표시 될 수있는 완전한 해결책이 아닙니다 (예 : 웹 브라우저 등). 사용자가 혼란스러워하고 대화 상자가 표시 될 것으로 예상하여 작업 표시 줄에서 기본 응용 프로그램을 선택하십시오. 그곳에는 다른 창 뒤에 묻혀 있습니다. 이것은 특히 멀티 스크린 디스플레이에서 문제가됩니다. – MoSlo