2012-04-05 4 views
0

대부분의 활성 Windows 탐색기 인스턴스의 전체 경로를 검색해야합니다.Windows 탐색기의 주소 표시 줄에 핸들 가져 오기 편집 컨트롤

그래서 Explorer.exe에 대한 핸들을 가지고 있습니다. HWND l_pExplorerhwnd = :: GetForegroundWindow();

검색된이 핸들을 사용하여 주소 표시 줄 편집 컨트롤을 가져와야합니다. Spy ++를 사용하고 ToolbarWindow32로 편집 컨트롤의 클래스 이름을 가져 왔습니다.

이제 다음 코드 스 니펫을 사용하여 FindWindowEx를 사용하여 창을 찾으려고했습니다. 그러나 나는 그것을 회수 할 수 없다.

HWND l_pExplorerhwnd = ::GetForegroundWindow(); 
    TCHAR l_szTempName[MAX_PATH]; 

    if(l_pExplorerhwnd) 
    { 
    ::GetWindowModuleFileName(l_pExplorerhwnd, l_szTempName, MAX_PATH); 
    MessageBox(0, l_szTempName, 0, 0); 
    if(::FindWindowEx(l_pExplorerhwnd, NULL, L"ToolbarWindow32", NULL)) 
    { 
     ::GetWindowText(::FindWindowEx(l_pExplorerhwnd, NULL, L"ToolbarWindow32", NULL), l_szTempName, MAX_PATH); 
     MessageBox(0, l_szTempName, 0, 0); 
    } 
    else 
    { 
     MessageBox(0, L"Error Error ", 0, 0); 
    } 
    } 
    else 
    { 
    MessageBox(0, L"Error Error Error", 0, 0); 
    } 
+3

결코 다른 프로세스의 창 계층을 혼란시키지 마십시오. 언제든지 변경 될 수 있으며 무례한 것입니다. 'shdocvw'에'ShellWindowsClass'와 같은 API가 있습니다. 당신이 필요로하는 것을 할 수도 있지만, 그런 종류의 일은 싫은 일이 있습니다. 당신이하려고하는 것에 대한 합법적 인 이유가 거의 없습니다. –

+0

아마도 주소 표시 줄로하려는 의도를 설명 할 수 있습니다. 아마 더 좋은 방법이있을 것입니다. 예를 들어 탐색기 창을보고 싶은지 또는보고있는 내용을 변경하려는 경우 [자동화 인터페이스 사용] (http://blogs.msdn.com/b/)을 참조하십시오. oldnewthing/archive/2004/07/20/188696.aspx) Explorer에 프로그램을 통합하려면 [ExplorerBrowser 객체 사용] (http://blogs.msdn.com/b/oldnewthing/archive/2011 /03/25/10145644.aspx).) –

답변

0

직접 귀하의 질문에 대답하기 위해 도와주세요, 부모 윈도우의 직계 자식이 아니라 자손에 FindWindowEx 작품. 따라서, 당신은 하나 아이 하나를 통과해야합니다 :

CabinetWClass 
WorkerW 
ReBarWindow32 
Address Band Root 
msctls_progress32 
Breadcrumb Parent 
ToolbarWindow32 

주를이 계층 구조가 지금 내 시스템에있는 것만입니다. Tom Whittock이 언급했듯이이를 사용하는 것은 매우 나쁜 습관입니다. 창 계층 구조가 업데이트를 통해 또는 런타임에 디자인별로 변경 될지 여부는 알 수 없습니다.

코드에 대한 댓글이 1 개 더 있습니다. TCHAR 매핑을 사용하고 있기 때문에 (비록 Win98을 지원하려고하지 않는 한 일반적으로 사용할 이유가 없지만) 문자열 리터럴은 L"" 대신 _T("")이어야합니다.

+0

고마워요. 방금 SPY ​​++를 확인하여 해답을 얻었습니다. 어쨌든 고마워요. – Rajasekhar

관련 문제