-1

私はアプリで何かをしようとしていますが、その名前などを知っています...(だから私はすでにfindwindowなどをキャストしています)例:そのウィンドウがフォーカスを取得しようとしたときにユーザーに通知したいと思います。

私はwndprocをいじっていますが、まったく理解していないようです。例:これがstackoverflowで見つけたコードで、実行しても失敗しました

    public IntPtr WndProc(int hwnd, int msg, IntPtr wParam, IntPtr lParam)
    {

        if (msg == WM_NCACTIVATE)
        {
            SystemSounds.Beep.Play();
            SystemSounds.Beep.Play();
            SystemSounds.Beep.Play();
            SystemSounds.Beep.Play();
            SystemSounds.Beep.Play();
        }

        return IntPtr.Zero;
    }

今私が理解していないのは、メッセージを表すと思うintmsgがあります。arent wndprocはそれを取得することになっているものですか?wndprocにそれを与えることのポイントは何ですか?

次に、この関数を実行します。どうすればよいですか、100ミリ秒ごとにメッセージをチェックしますか、それともイベントタイプのものがありますか?

私はここで本当に混乱しています、そして私はここで少し助けていただければ幸いです。

4

1 に答える 1

3

私はあなたがここで何を求めているのか完全には理解していないのではないかと思います。

見つけたWndProc関数の定義は、C#でのようにはなりません。代わりに、クラスのWndProcメンバー関数をControlオーバーライドします。すべてのウィンドウメッセージは、この関数を介してルーティングされます。.NET Frameworkがまだ​​実行していないことを実行するために、通常とは異なる方法でメッセージを処理する場合にのみ、これをオーバーライドします。

たとえば、フォームの場合、次のようにWndProcをオーバーライドします。

public class MyForm : Form
{
    // other code

    protected override void WndProc(ref Message m)
    {
        switch (m.Msg)
        {
            case WM_NCACTIVATE:
            {
                SystemSounds.Beep.Play();
                break;  
            }
            base.WndProc(ref m);  // proceed with default processing
        }
    }
}

.NET Frameworkは、Win32 APIのように4つの生のパラメーターを関数に渡すのではなく、すべてのメッセージ情報をMessage構造体にラップすることに注意してください。

メッセージの略だと思うintmsgがあります。arent wndprocはそれを取得することになっているものですか?wndprocにそれを与えることのポイントは何ですか?

Message.Msgメンバーint msgは、関数定義のパラメーターに対応します。これは、処理されるウィンドウメッセージの識別子です。これらはすべてWindowsヘッダーファイル内で定義されており、通常は。で始まりますWM_。これらのメッセージのドキュメントはMSDNにあり、メッセージの意味と受信時期がわかります。たとえば、WM_NCACTIVATEメッセージは、非クライアント領域がアクティブ化または非アクティブ化されているときにウィンドウに送信されます。

WndProc関数は、メッセージが受信されるたびに呼び出されます。受信したメッセージ、したがってどのメッセージを処理する必要があるかを判断する方法は、Message.Msgメンバーの値(または元の例ではmsgパラメーター)をオンにすることです。

次に、この関数を実行します。どうすればよいですか、100ミリ秒ごとにメッセージをチェックしますか、それともイベントタイプのものがありますか?

何もチェックする必要はありません。WndProcは、自分で作成した関数を含め、他の関数と同じように関数です。つまり、実行する必要があるときにのみ呼び出されます

WndProc関数内のデフォルトの処理は、受信した特定のメッセージに応答して使い慣れたイベントを発生させる役割を果たしますが、それ自体はイベントではありません。

私はアプリで何かをしようとしていますが、その名前などを知っています...(だから私はすでにfindwindowなどをキャストしています)例:そのウィンドウがフォーカスを取得しようとしたときにユーザーに通知したいと思います。

これが何を意味するのか正確にはわかりませんが、WM_ACTIVATEAPPメッセージを調べる必要があります。このメッセージは、ウィンドウがアクティブ化されているとき、および非アクティブ化されているときはいつでもウィンドウに送信されます。そのメッセージに応えて、あなたは音を出すことを含めて、あなたが好きなことをすることを選ぶことができました。リンクされたドキュメントが示すように、wParamパラメーター(Message.WParamメンバーにあります)は、ウィンドウがアクティブ化されているか非アクティブ化されているかを示します。

これは、それが得るのとほぼ同じくらい進んでいます。WinFormsでプログラミングしているときに、WndProcメソッドをオーバーライドする必要があることは非常にまれです。そうすることで、ほとんど何でもできますが、ほとんどの場合、より良い、より簡単な方法があります。

于 2012-07-26T13:40:06.420 に答える