C# 如何获取C语言中的消息?

C# 如何获取C语言中的消息?,c#,winforms,winsock,message,C#,Winforms,Winsock,Message,如何获取特定方法的特定消息 我见过一些例子,人们使用ref,但我不明白 例如,在delphi中,我的functionmethod必须在主窗体类中声明,并且必须在声明旁边放置消息 type TForm1 = class(TForm) ... protected procedure MessageHandler(var Msg:Tmessage);Message WM_WINSOCK_ASYNC_MSG; end; 我需要用C语言编写,这样我就可以在我的应用程序中使用WSA

如何获取特定方法的特定消息

我见过一些例子,人们使用ref,但我不明白

例如,在delphi中,我的functionmethod必须在主窗体类中声明,并且必须在声明旁边放置消息

type
  TForm1 = class(TForm)
    ...
  protected
    procedure MessageHandler(var Msg:Tmessage);Message WM_WINSOCK_ASYNC_MSG;
end;
我需要用C语言编写,这样我就可以在我的应用程序中使用WSAAsyncSelect

选中>我的另一个问题您可以覆盖控件(例如表单)上的方法

WndProc引用消息对象。C中的ref参数类似于Delphi中的var参数。message对象具有包含消息类型的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);
}

在.NET winforms中,所有消息都会转到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更合适。

使用BeginRecv EndRecv有时会丢失数据包或延迟太大。我无法使用它。我真的想要WSAAsyncSelect。我在这里提出的问题中为此付出了我所有的声誉\n\n关于这里的答案-如何添加WndProc?我的应用程序中没有。如果您有表单,您只需键入.cs受保护的覆盖无效WndProc…好的,谢谢,我将创建另一个关于如何获取句柄的问题。谢谢!