プログラマメモ VB6.0_ウィンドウプロシージャのオーバーライド

※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

ウィンドウプロシージャのオーバーライド

1、APIを宣言します。
'[SetWindowLong]----------------------------------------------------------------
'指定ウィンドウ情報変更API
'[引数]
'-hWnd      :設定対象のウィンドウのハンドル
'-nIndex    :変更するデータの指定
'-dwNewLong :設定する32ビット値
'[戻り値]
'-正常終了  :変更前の値
'-異常終了  :0
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
'nIndex定数
Private Const GWL_EXSTYLE = (-20)		'拡張ウィンドウスタイルを取得します。
Private Const GWL_STYLE = (-16)			'ウィンドウスタイルを取得します。
Private Const GWL_WNDPROC = (-4)		'ウィンドウプロシージャのアドレス、またはウィンドウプロシージャのアドレスを示すハンドルを取得します。
Private Const GWW_HINSTANCE = (-6)		'アプリケーションのインスタンスハンドルを取得します。
Private Const GWL_HINSTANCE = (-6)		'インスタンスハンドルを取得
Private Const GWL_HWNDPARENT = (-8)		'アプリケーションのインスタンスハンドルを取得します。
Private Const GWW_ID = (-12)			'ウィンドウの ID を取得します。
Private Const GWL_USERDATA = (-21)		'ウィンドウに関連付けられたアプリケーション定義の 32 ビット値を取得します。

2、「SetWindowLong」APIを使用しメッセージを取得したいウィンドウに取得先を変更させます
mlngOldHandl = SetWindowLong(Form1.hWnd, GWL_WNDPROC, AddressOf WindowProc)
※戻り値(mlngOldHandl)の以前のハンドルは指定したウィンドウプロシージャがアクセスできる変数スコープで保持します。
※設定している32ビット値(WindowProc)はメッセージが取得されて来てほしいプロシージャ名を指定します。

3、指定のウィンドウプロシージャを作成しメッセージをフックします。
'----------------------------------------------------------------
'名称:WindowProc
'説明:ウィンドウプロシージャ コールバック関数
'----------------------------------------------------------------
Public Function WindowProc(ByVal hTargetWnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Select Case msg
        Case TRAY_NOTIFYICON
            'タスクトレイの操作など
        Case WM_MOVE
            'マウス移動の操作など
    End Select
    WindowProc = CallWindowProc(mlngOldHandl, hTargetWnd, msg, wParam, lParam)
End Function