2010-05-27 4 views
2

일부 윈도우 (내 경우에는 VLC 플레이어 창)에서 보낸 WM_SETTEXT와 같은 Windows 시스템 메시지를 어떻게 트래핑 할 수 있습니까? 나는이 같은 NativeWindow 클래스를 상속 된 WndProc를 재정의 시도했다 :.NET에서 메시지 트래핑

내가 WM_SETTEXT 메시지가 VLC 플레이어에서 보낸하지만 내 코드는 작업을 완수하는 것 같지 않습니다 마이크로 소프트 스파이 ++로 확인했다
class VLCFilter : NativeWindow 
{ 
    System.IntPtr iHandle; 
    const int WM_SETTEXT = 0x000C; 

    public VLCFilter() 
    { 
     Process p = Process.GetProcessesByName("vlc")[0]; 
     iHandle = p.MainWindowHandle; 
    } 

    protected override void WndProc(ref Message aMessage) 
    { 
     base.WndProc(ref aMessage); 

     if (aMessage.HWnd != iHandle) 
     return false; 

     if (aMessage.Msg == WM_SETTEXT) 
     { 
      MessageBox.Show("VLC window text changed!"); 
     } 
    } 
} 

. 나는 주로 다음을 참고했다 : http://www.codeproject.com/kb/dotnet/devicevolumemonitor.aspx

나는이 작품을 성공시키지 않으려 고 노력하고있다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 내가 뭘하고 있는거야? 어쩌면 이렇게 쉬운 방법이 있을까요?

나의 초기 목표는 VLC 플레이어 (백그라운드에서 재생할 수 있고 응용 프로그램에서 emmbed되지 않음)가 재생을 반복 할 때를 잡는 것입니다 (WM_SETTEXT 메시지가 전송 된 것을 발견하고이를 찾으려고합니다.) 이런 식으로).

답변

0

기본 구현 호출 전에 내용을 변경하십시오. 그렇지 않으면 Message의 값이 변경되었을 수 있습니다.

+0

좋은 점;) –

1

코드에 도달 했습니까? NativeWindow에서 상속 받았지만 실제 창은 VLCFilter 클래스에서 상속하지 않았 음을 짐작합니다. System.Windows.Forms.Form을 다시 작성해야하기 때문에 실제적으로 어려운 일이 될 것입니다. (거기에 상속이 있다고 생각하지만 정직하게 프레임 워크의 내부 구조가 확실하지 않습니다.)

아마도 대신 Form에서 상속 받아 양식을 Form 대신 새 클래스에서 상속 받아야합니까?

0

코드에서 어딘가에 NativeWindow.AssignHandle으로 전화해야합니다. 그렇지 않은 경우 (또는 잘못된 핸들을 전달하는 경우) 재정의 된 WndProc이 호출되지 않습니다.

편집 : 그러나 VLC는 별도의 프로세스에서 실행되기 때문에이 기술은 작동하지 않습니다. NativeWindow.AssignHandle 방법 상태에 대한 문서 :

참고 : 핸들이 지정하는 다른 응용 프로그램 프로세스에있을 수 없습니다.

1

여러분의 답변에 감사드립니다. ;) 다음 : http://www.codeproject.com/KB/system/WilsonSystemGlobalHooks.aspx 트릭을했는데 지금은 내가 원하는 이벤트에 푹 빠져 있습니다. 모든 것이 잘 작동합니다. 단 하나의 결함이 있습니다. WndProc을 ovverriding하면 양식이 작성되는 즉시 메시지를 수신하기 시작합니다. 일시적으로 WndProc을 수신하지 못하도록 설정하는 방법이 있습니까?

관련 문제