Переопределение .NET WebBrowsers WndProc - PullRequest
2 голосов
/ 08 февраля 2011

Для одного из моих проектов я переопределяю элемент управления AXShockwaveFlash, чтобы отключить щелчок правой кнопкой мыши, и я могу управлять им, используя следующий код;

public class FlashPlayer : AxShockwaveFlashObjects.AxShockwaveFlash
{
    private const int WM_MOUSEMOVE = 0x0200;
    private const int WM_MOUSEWHEEL = 0x020A;
    private const int WM_LBUTTONDOWN = 0x0201;
    private const int WM_LBUTTONUP = 0x0202;
    private const int WM_LBUTTONDBLCLK = 0x0203; 
    private const int WM_RBUTTONDOWN = 0x0204;
    private const int WM_RBUTTONUP = 0x0205;                      

    public new event MouseEventHandler DoubleClick;

    public new event MouseEventHandler MouseDown;

    public new event MouseEventHandler MouseUp;

    public new event MouseEventHandler MouseMove;

    public FlashPlayer()
    {
        this.HandleCreated += FlashPlayer_HandleCreated; // listen for the HandleCreated event.
    }

    void FlashPlayer_HandleCreated(object sender, EventArgs e) // make required configuration changes.
    {
        this.AllowFullScreen = "true";
        this.AllowNetworking = "all";
        this.AllowScriptAccess = "always";
    }

    protected override void WndProc(ref Message m) // Override's the WndProc and disables Flash activex's default right-click menu and if one exists shows the attached ContextMenuStrip.
    {
        switch (m.Msg)
        {
            case WM_LBUTTONDOWN:
                if (this.MouseDown != null) this.MouseDown(this, new MouseEventArgs(MouseButtons.Left, 1, Cursor.Position.X, Cursor.Position.Y, 0));
                break;
            case WM_LBUTTONUP:
                if (this.MouseUp != null) this.MouseUp(this, new MouseEventArgs(MouseButtons.None, 0, Cursor.Position.X, Cursor.Position.Y, 0));
                break;
            case WM_MOUSEMOVE:
                if (this.MouseMove != null) this.MouseMove(this, new MouseEventArgs(MouseButtons.None, 0, Cursor.Position.X, Cursor.Position.Y, 0));
                break;
            case WM_RBUTTONDOWN:
                if (this.ContextMenuStrip != null) this.ContextMenuStrip.Show(Cursor.Position.X, Cursor.Position.Y);
                m.Result = IntPtr.Zero; // don't allow actual flash control process the message by flagging it as processed.
                return;
            case WM_LBUTTONDBLCLK:
                if (this.DoubleClick != null) this.DoubleClick(this, new MouseEventArgs(MouseButtons.Left, 2, Cursor.Position.X, Cursor.Position.Y, 0));
                m.Result = IntPtr.Zero; // don't allow actual flash control process the message by flagging it as processed.
                return;
        }

        base.WndProc(ref m); // when we're done with processing the events, let the message pass to others also too.
    }
}

Я пытаюсь использовать код и для элемента управления WebBrowser, но мои события щелчка на WndProc WebBrowser вообще не перехватываются.

Есть идеи?

Обновление : я пытаюсь полностью отключить щелчок правой кнопкой мыши в веб-браузере, IsWebBrowserContextMenuEnabled не работает в моем состоянии, поскольку флэш-компонент в веб-браузере все еще обрабатывает щелкните правой кнопкой мыши и создайте собственное меню.

Ответы [ 2 ]

2 голосов
/ 15 февраля 2011

Я полагаю, что с вашим обновлением проблема в том, что WebBrowser не получает сообщения, потому что сообщения перенаправляются в окно Flash.Отключение флеш-плеера без окон (я думаю, это параметр wmode) может сработать, в противном случае вам нужно будет перечислить дочерние окна веб-браузера, чтобы найти элемент управления, а затем создать его подкласс.

0 голосов
/ 15 февраля 2011

Я нашел немного сложное решение в этой теме (так что, не вините меня): social.msdn.microsoft.com / forums ...

...