2010-12-28 6 views
1
uMsgNotify = WinApi.RegisterWindowMessage("SHELLHOOK"); 
    WinApi.RegisterShellHookWindow(this.Handle); 
내 양식 생성자

응용 프로그램이 기본 Windows 데스크톱 셸로 설정된 경우 WndProc에서 셸 훅 메시지를받지 못하는 이유는 무엇입니까? 내 오버라이드의 WndProc에서

에서

이 : 기본 Windows 셸이 Explorer.exe에서 때

protected override void WndProc(ref System.Windows.Forms.Message m) 
{ 
    IntPtr handle; 
    if (m.Msg == uMsgNotify) 
    { 
     switch (m.WParam.ToInt32()) 
     { 
      case WinApi.HSHELL_WINDOWCREATED: 
       handle = m.LParam; 
       string windowName = GetWindowName(handle); 
       MessageBox.Show(windowName+" "+handle.ToString()); 
       break; 
      case WinApi.HSHELL_WINDOWDESTROYED: 
       handle = m.LParam; 
       MessageBox.Show(handle.ToString()); 
       break; 
     } 
    } 
    base.WndProc(ref m); 
} 

그래서이 승리 양식은 잘 작동합니다. 모든 이벤트를 모두 생성하고 파괴 한 창과 이름을 얻을 수 있습니다. 내 app.exe를 defaul windows shell로 설정할 때. 메시지를 수신하지 않습니다.

dll 함수 삽입, 별도의 dll 파일을 후킹 용으로 사용해야합니까? 간단하고 쉬운 솔루션을 얻으려고했습니다.

아이디어가 있으십니까?

감사

답변

3

WH_SHELL 문서가 명시 적으로 상태 : 사용자 정의 셸 응용 프로그램 할 것을

참고하지 는 WH_SHELL 메시지가 나타납니다. 따라서, 기본 쉘 로 등록 자체가 (또는 다른 응용 프로그램) 이전 SystemParametersInfo 함수를 호출해야하는 응용 프로그램은 WH_SHELL 메시지를받을 수 있습니다. 이 함수는 을 SPI_SETMINIMIZEDMETRICSMINIMIZEDMETRICS 구조로 지정해야합니다. iArrange 구성원을 ARW_HIDE로 설정하십시오.

+0

감사합니다. Franci에게 감사하지만, 디버깅, 인터넷 검색을 3 ~ 4 시간 더 테스트했습니다. 문제는 WinApi 구조체와 함수를 C#으로 변환하고 MINIMIZEDMETRICS 구조를 설정하여 적절한 순서로 호출하는 것이 었습니다. 어쨌든 지금은 완벽하게 작동하고 있습니다. 나는 카이로 데스크톱 소스 코드와이 스레드를 사용했다. http://social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/cfaa9f53-8bfd-4a0a-9e9a-4c2b7d47327a – nasko7

+0

@ nasko7 - 당신이 pinvoke를 사용한다고 믿는다. . NET에서 Win32 API 및 구조체에 적합한 C# 정의를 얻으려면 어떻게해야합니까? :-) –

+0

예 저는 pinvoke.net을 사용했습니다 :) 다시 한번 감사드립니다. – nasko7