Как я могу получать сообщения в C #? - PullRequest
0 голосов
/ 19 апреля 2009

Как я могу получить конкретное сообщение по определенному методу?

Я видел несколько примеров, и люди используют "ref", но я не понимаю этого.

Например, в delphi моя функция (метод) должна быть объявлена ​​в классе Main Form, а рядом с объявлением я должен поместить сообщение

type
  TForm1 = class(TForm)
    ...
  protected
    procedure MessageHandler(var Msg:Tmessage);Message WM_WINSOCK_ASYNC_MSG;
end;

Мне это нужно в C #, чтобы я мог использовать WSAAsyncSelect в своем приложении

Отметьте > мой другой Вопрос <</a> с репутацией Баунти 550, чтобы понять, что я имею в виду

Ответы [ 2 ]

7 голосов
/ 19 апреля 2009

Вы можете переопределить метод WndProc для элемента управления (например, формы).

WndProc получает ссылку на объект сообщения. Параметр ref в C # похож на параметр var в Delphi. Объект сообщения имеет свойство Msg, которое содержит тип сообщения, например (из MSDN):

protected override void WndProc(ref Message m) 
{
    // Listen for operating system messages.
    switch (m.Msg)
    {
        // The WM_ACTIVATEAPP message occurs when the application
        // becomes the active application or becomes inactive.
        case WM_ACTIVATEAPP:

            // The WParam value identifies what is occurring.
            appActive = (((int)m.WParam != 0));

            // Invalidate to get new text painted.
            this.Invalidate();

            break;                
    }        
    base.WndProc(ref m);
}
5 голосов
/ 19 апреля 2009

В WinNET-формах .NET все сообщения отправляются на WndProc, поэтому вы можете изменить это:

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_WINSOCK_ASYNC_MSG)
        {
            // invoke your method
        }
        else
        {
            base.WndProc(ref m);
        }
    }

Если я неправильно понял, пожалуйста, скажите - но я думаю, что вы бы преуспели, чтобы избежать этого низкоуровневого подхода, и опишите, чего вы хотите достичь - то есть, возможно, .Invoke / .BeginInvoke более уместны.

...