Перехват сообщений в .NET - PullRequest
2 голосов
/ 27 мая 2010

Как я могу перехватить системное сообщение Windows (например, WM_SETTEXT), которое было отправлено некоторым окном (окно проигрывателя VLC в моем случае)? Я пытался унаследовать класс NativeWindow и переопределить WndProc следующим образом:

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

Я проверил в Microsoft Spy ++, что сообщение WM_SETTEXT отправляется проигрывателем VLC, но мой код, похоже, не выполняет работу. Я ссылался в основном на: http://www.codeproject.com/kb/dotnet/devicevolumemonitor.aspx

Я пытаюсь заставить это работать какое-то время безуспешно. Что я делаю неправильно? Что я не делаю? Может быть, есть более простой способ сделать это?

Моя первоначальная цель - поймать, когда проигрыватель VLC (который может играть где-то в фоновом режиме и не вставляется в мое приложение) повторяет свое воспроизведение (заметил, что сообщение WM_SETTEXT отправляется тогда, и я пытаюсь его выяснить как это).

Ответы [ 5 ]

1 голос
/ 29 мая 2010

Здравствуйте и спасибо за Ваши ответы. ;) После: http://www.codeproject.com/KB/system/WilsonSystemGlobalHooks.aspx сделал свое дело, и теперь я подключен к событию, которое я хотел. Все работает отлично, есть только один глюк: при переопределении WndProc он начинает получать сообщения, как только создается форма. Есть ли способ временно отключить получение этих сообщений WndProc и включить его только тогда, когда я хочу их получить?

1 голос
/ 27 мая 2010

Полагаю, вы могли бы использовать крюк технику.Он предназначен для таких случаев.

Кроме того, эти ссылки могут быть полезны, несмотря на то, что их легко гуглить.http://www.codeproject.com/KB/cs/netwin32hooks.aspx http://www.codeproject.com/KB/system/WilsonSystemGlobalHooks.aspx

1 голос
/ 27 мая 2010

Достигнут ли ваш код? Я предполагаю, что вы унаследовали от NativeWindow, но фактические окна не унаследовали от вашего VLCFilter класса. Что на самом деле будет очень трудной вещью, потому что вам, вероятно, придется переписать System.Windows.Forms.Form ... (Я предполагаю, что там есть наследование, но, честно говоря, не уверен, что внутренняя структура в структуре.)

Возможно, вам следует вместо этого наследовать от Form, и тогда ваши формы наследуются от вашего нового класса вместо Form?

0 голосов
/ 27 мая 2010

Где-то в вашем коде вы должны вызывать NativeWindow.AssignHandle . Если вы не (или если вы передаете неправильный дескриптор), то ваш переопределенный WndProc не будет вызван.

Редактировать: Однако, поскольку VLC работает в отдельном процессе, этот метод не будет работать. Документация для метода NativeWindow.AssignHandle гласит:

Примечание: Дескриптор для назначения не может быть в другом процессе приложения.

0 голосов
/ 27 мая 2010

Делайте ваши вещи перед вызовом базовой реализации, иначе значения в Message могли бы измениться.

...