0

特定のメソッドで特定のメッセージを取得するにはどうすればよいですか?

いくつかの例を見たことがありますが、人々は「ref」を使用していますが、理解できません。

たとえば、デルファイでは、関数 (メソッド) をメイン フォーム クラスで宣言する必要があり、宣言の隣にメッセージを配置する必要があります。

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

アプリケーションで WSAAsyncSelect を使用できるように、C# でこれが必要です。

私が何を意味するかを理解するために、バウンティ550の評判で>私の他の質問<を確認してください

4

2 に答える 2

7

コントロール (フォームなど) でWndProcメソッドをオーバーライドできます。

WndProc は、メッセージ オブジェクトへの参照を受け取ります。C# の ref パラメータは、Delphi の var パラメータに似ています。メッセージ オブジェクトには、メッセージ タイプを含む 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);
}
于 2009-04-19T09:06:20.317 に答える
5

.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の方が適切かもしれません.

于 2009-04-19T09:10:41.417 に答える