Windowsメッセージメカニズム-delphiメッセージメカニズム学習ノートを理解します.
2936 ワード
一、何がニュースですか.
メッセージはwindowsがアプリケーションに送信した「何らかのイベントが発生した」という通知です.例えばマウスをクリックしたり、ウィンドウのサイズを調整したり、キーボードでキーを押したりすると、windowsがアプリケーションにメッセージを送信したりして、アプリケーションに何が起こったかを通知します.
Windowsはアプリケーションにrecord形式でメッセージを送信します.レコードには、イベントのタイプと追加の特定の情報が含まれます.Windowsがアプリケーションに送信記録タイプはTMsgであり、windowsで定義.pasユニットでは、以下のように定義されています.
メッセージフィールドのレコードの説明:
Hwnd:32ビットwindowsハンドルは、メッセージが送信されるウィンドウを指します.このウィンドウはほとんどのスクリーンオブジェクトであってもいいです.windowはほとんどのオブジェクトに対してウィンドウハンドルを維持しているからです.
Message:あるメッセージの定数値を表し、これらの定数はwindowsであってもよい.pasで予め定義された標準windowsメッセージは、ユーザがカスタマイズしたメッセージであってもよい.
Wparam:このフィールドには、メッセージに関連付けられた定数値が多く含まれます.ウィンドウハンドルまたはメッセージに関連付けられたウィンドウまたはコントロールのID値も含まれます.
Lparam:このフィールドには、wparamとlparamが32ビットサイズであるため、メモリデータに対するインデックスまたはポインタが常に格納されています.強制タイプ変換が可能です.
WMの先頭は通常WindowsMessageを指す.
二、常用windowsメッセージ:
wm_Active:ウィンドウがアクティブ
wm_charキーを押してwm_を送信keydownとwm_keyupメッセージ
wm_closeウィンドウが閉じる
wm_keydownユーザーがキーボードのキーを押しています
wm_keyup:ユーザーが押したキーを解放しました
wm_lbuttondownユーザーがマウスの左ボタンを押す
wm_mousemoveユーザーがマウスを移動しています
wm_paintウィンドウ領域を再描画する必要があります
wm_timerタイマーイベントが発生しました
wm_quit:プログラム終了要求の送信
三、windowsメッセージシステムの動作方式
3つのセクション:メッセージキュー、メッセージループ、ウィンドウ・プロシージャ.
メッセージキュー:Windowsはアプリケーションごとにメッセージキューを維持し、windowsアプリケーションはこのキューからメッセージを取得し、得られたメッセージを適切なウィンドウに割り当てる必要があります.
メッセージループ:windowsプログラムはアプリケーションキューからメッセージを取得し、適切なウィンドウに割り当て、次のメッセージを取得し、適切なウィンドウに配布します.このメッセージメカニズムはメッセージループである.
≪ウィンドウ・プロシージャ|Window Procedure|ldap≫:アプリケーション内の各ウィンドウには、メッセージ・ループから送信される各メッセージを受け入れるウィンドウ・プロシージャがあります.ウィンドウ・プロシージャのタスクは、各ウィンドウ・メッセージを受信し、それに対応する応答を行うことです.ウィンドウプロシージャはいわゆるコールバック関数であり、メッセージを処理した後、ウィンドウプロシージャは通常windowsに戻り値を与えます.
四、自分のメッセージを送る:
アプリケーションウィンドウとコントロールの間でメッセージを送信する必要があります.Delphiでは、次の方法があります.
Perform()メソッド:VCLは、既知のオブジェクトインスタンスのオブジェクトまたはコントロールオブジェクトにメッセージを送信できるすべてのTContol派生クラスにperform()メソッドを提供します.Performには、メッセージ、対応するlparam、wparamの3つのパラメータがあります.次のようになります.
フォームまたはコントロールにメッセージを送信するには、次のフォーマットを使用します.
Performは同期呼び出しであるため,メッセージが処理されるまで戻り値が得られない.Perform()メソッドは、そのパラメータをTMessageレコードに組み合わせ、オブジェクトのDispatchメソッドを呼び出してこのメッセージを送信し、windowsAPIメッセージシステムを迂回します.
Sendmessage()とpostmessage()API関数:
Sendmessageはperform()と同様に同期して呼び出されます.メッセージは直接目的のウィンドウに送信され、このメッセージは処理されてから返される.postmessageは非同期呼び出しでwindowsキューにメッセージを送信し、すぐに戻ります.
通知メッセージ:ウィンドウのサブコントロールにイベントが発生し、親ウィンドウに通知する必要がある場合は、このメッセージを送信します.Windows標準コントロール、button、listbox、combox、tree view、list viewなどの汎用コントロールでのみ発生します.
メッセージはwindowsがアプリケーションに送信した「何らかのイベントが発生した」という通知です.例えばマウスをクリックしたり、ウィンドウのサイズを調整したり、キーボードでキーを押したりすると、windowsがアプリケーションにメッセージを送信したりして、アプリケーションに何が起こったかを通知します.
Windowsはアプリケーションにrecord形式でメッセージを送信します.レコードには、イベントのタイプと追加の特定の情報が含まれます.Windowsがアプリケーションに送信記録タイプはTMsgであり、windowsで定義.pasユニットでは、以下のように定義されています.
{ Message structure }
PMsg = ^TMsg;
tagMSG = packed record
hwnd: HWND;
message: UINT;
wParam: WPARAM;
lParam: LPARAM;
time: DWORD;
pt: TPoint;
end;
{$EXTERNALSYM tagMSG}
TMsg = tagMSG;
MSG= tagMSG;
{$EXTERNALSYM MSG}
メッセージフィールドのレコードの説明:
Hwnd:32ビットwindowsハンドルは、メッセージが送信されるウィンドウを指します.このウィンドウはほとんどのスクリーンオブジェクトであってもいいです.windowはほとんどのオブジェクトに対してウィンドウハンドルを維持しているからです.
Message:あるメッセージの定数値を表し、これらの定数はwindowsであってもよい.pasで予め定義された標準windowsメッセージは、ユーザがカスタマイズしたメッセージであってもよい.
Wparam:このフィールドには、メッセージに関連付けられた定数値が多く含まれます.ウィンドウハンドルまたはメッセージに関連付けられたウィンドウまたはコントロールのID値も含まれます.
Lparam:このフィールドには、wparamとlparamが32ビットサイズであるため、メモリデータに対するインデックスまたはポインタが常に格納されています.強制タイプ変換が可能です.
WMの先頭は通常WindowsMessageを指す.
二、常用windowsメッセージ:
wm_Active:ウィンドウがアクティブ
wm_charキーを押してwm_を送信keydownとwm_keyupメッセージ
wm_closeウィンドウが閉じる
wm_keydownユーザーがキーボードのキーを押しています
wm_keyup:ユーザーが押したキーを解放しました
wm_lbuttondownユーザーがマウスの左ボタンを押す
wm_mousemoveユーザーがマウスを移動しています
wm_paintウィンドウ領域を再描画する必要があります
wm_timerタイマーイベントが発生しました
wm_quit:プログラム終了要求の送信
三、windowsメッセージシステムの動作方式
3つのセクション:メッセージキュー、メッセージループ、ウィンドウ・プロシージャ.
メッセージキュー:Windowsはアプリケーションごとにメッセージキューを維持し、windowsアプリケーションはこのキューからメッセージを取得し、得られたメッセージを適切なウィンドウに割り当てる必要があります.
メッセージループ:windowsプログラムはアプリケーションキューからメッセージを取得し、適切なウィンドウに割り当て、次のメッセージを取得し、適切なウィンドウに配布します.このメッセージメカニズムはメッセージループである.
≪ウィンドウ・プロシージャ|Window Procedure|ldap≫:アプリケーション内の各ウィンドウには、メッセージ・ループから送信される各メッセージを受け入れるウィンドウ・プロシージャがあります.ウィンドウ・プロシージャのタスクは、各ウィンドウ・メッセージを受信し、それに対応する応答を行うことです.ウィンドウプロシージャはいわゆるコールバック関数であり、メッセージを処理した後、ウィンドウプロシージャは通常windowsに戻り値を与えます.
四、自分のメッセージを送る:
アプリケーションウィンドウとコントロールの間でメッセージを送信する必要があります.Delphiでは、次の方法があります.
Perform()メソッド:VCLは、既知のオブジェクトインスタンスのオブジェクトまたはコントロールオブジェクトにメッセージを送信できるすべてのTContol派生クラスにperform()メソッドを提供します.Performには、メッセージ、対応するlparam、wparamの3つのパラメータがあります.次のようになります.
function Tcontrol.perform(Msg :cardinal;wparam,lparam:longint):longint;
フォームまたはコントロールにメッセージを送信するには、次のフォーマットを使用します.
Retval:=controlname.perform(messageid,lparam,wparam);
Performは同期呼び出しであるため,メッセージが処理されるまで戻り値が得られない.Perform()メソッドは、そのパラメータをTMessageレコードに組み合わせ、オブジェクトのDispatchメソッドを呼び出してこのメッセージを送信し、windowsAPIメッセージシステムを迂回します.
Sendmessage()とpostmessage()API関数:
Sendmessageはperform()と同様に同期して呼び出されます.メッセージは直接目的のウィンドウに送信され、このメッセージは処理されてから返される.postmessageは非同期呼び出しでwindowsキューにメッセージを送信し、すぐに戻ります.
通知メッセージ:ウィンドウのサブコントロールにイベントが発生し、親ウィンドウに通知する必要がある場合は、このメッセージを送信します.Windows標準コントロール、button、listbox、combox、tree view、list viewなどの汎用コントロールでのみ発生します.