私はあなたがここで何を求めているのか完全には理解していないのではないかと思います。
見つけた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メソッドをオーバーライドする必要があることは非常にまれです。そうすることで、ほとんど何でもできますが、ほとんどの場合、より良い、より簡単な方法があります。