Процедура окна подклассов элемента управления ActiveX в .NET - PullRequest
1 голос
/ 05 мая 2011

Я использую элемент управления Flash ActiveX в своем приложении. Я хотел бы отключить его меню правой кнопки мыши. Поскольку элемент управления не предоставляет API для этого, я хочу создать подкласс оконной процедуры и перехватить сообщение WM_RBUTTONDOWN. Я успешно сделал это под Qt, но я понятия не имею, как это можно сделать в C #.

В моей реализации C ++ / Qt я использовал SetWindowLong для хранения указателя this обертки activex, который, в свою очередь, содержал поле, в котором хранился процесс окна oringal. Я устанавливаю оконную процедуру для себя (снова с SetWindowLong) и любые сообщения, которые я не хочу обрабатывать, я передаю исходному WNDPROC с CallWindowProc.

Как я могу сделать это в .NET?

Ответы [ 2 ]

3 голосов
/ 05 мая 2011

Вы можете сделать это точно так же, как в C #. Вам нужно использовать P / Invoke для вызова неуправляемого API Windows из управляемого кода. В Интернете есть множество статей, в которых показано, как использовать P / Invoke.

На самом деле вы можете сделать это еще проще, используя класс NativeWindow, как объяснено здесь . Код выглядит так:

public class SubclassHWND : NativeWindow
{
   protected override void WndProc(ref Message m)
   {
      // Perform whatever custom processing you must have for this message
      System.Diagnostics.Debug.WriteLine(m.ToString());
      // forward message to base WndProc
      base.WndProc(ref m);
   }
}

SubclassHWND s = new SubclassHWND();
s.AssignHandle(theWindowHandle);
//Now s should be listening to the messages of the form.

Другой способ использовать делегат вместо указателя функции: Marshal.GetFunctionPointerForDelegate()

0 голосов
/ 05 августа 2013

Хотя это старый, я только что наткнулся на этот код по этой ссылке, и он ОЧЕНЬ полезен.По сути, он подклассирует сам элемент управления ActiveX и отключает щелчок правой кнопкой мыши в этой точке.

Через: http://www.codeproject.com/Articles/29102/How-To-Disable-FlashPlayer-AxShockwaveFlash-Right

public class IForcePlayer : AxShockwaveFlash
{
const int WM_RBUTTONDOWN = 0x0204;

protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_RBUTTONDOWN)
    {
        m.Result = IntPtr.Zero;
        return;
    }
    base.WndProc(ref m);
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...