2010-05-27 79 views
2

如何捕獲由某個窗口(我的案例中的VLC播放器窗口)發送的Windows系統消息(如WM_SETTEXT)?我試圖繼承NativeWindow類並重寫的WndProc這樣的:在.NET中捕獲郵件

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!"); 
     } 
    } 
} 

我已經與微軟間諜++中WM_SETTEXT消息由VLC播放發送,但我的代碼似乎並沒有完成工作檢查。我主要提到: http://www.codeproject.com/kb/dotnet/devicevolumemonitor.aspx

我試圖讓這項工作一段時間沒有成功。我究竟做錯了什麼?我沒有做什麼?也許有更簡單的方法來做到這一點?我最初的目標是捕捉當VLC播放器(可能在背景中播放某處並且在我的應用程序中不是emmbed)重複其播放(注意到WM_SETTEXT消息發送了,然後我試圖找到它像這樣)。

回答

0

在調用基本實現前做你的事情,否則Message中的值可能已經改變。

+0

好點那裏;) – 2010-05-29 17:49:48

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做了伎倆,現在我迷上了我想要的事件。一切工作正常,只有一個小故障:當ovverriding WndProc它開始收到消息,只要形式創建。有沒有辦法暫時禁用WndProc接收這些消息,並啓用只有當我想要得到它們?