mhGetData 関数、mhSetData 関数の例

このプログラムは、WM_GETMINMAXINFO メッセージをフックし、パラメータを変更することによって、フォームの最小サイズと最大サイズを制限します。この例では、メッセージとともに渡される MINMAXINFO ユーザ定義型変数にアクセスし、変数に加えた変更を反映するために、mhGetData 関数および、mhSetData 関数を使用しています。このプログラムを実行するには、新規フォーム モジュール (Form1) を作成し、そこにメッセージ フック コントロール (MessageHook1) を配置し、以下のコードをフォームのコード モジュールへ貼り付けます。

VB
' 定数の宣言。
Const WM_GETMINMAXINFO = &H24

' ユーザ定義型の宣言。
Private Type POINTAPI
    x As Long
    y As Long
End Type

Private Type MINMAXINFO
    ptReserved     As POINTAPI
    ptMaxSize      As POINTAPI
    ptMaxPosition  As POINTAPI
    ptMinTrackSize As POINTAPI
    ptMaxTrackSize As POINTAPI
End Type

Private Sub Form_Load()
    ' フック対象のフォームを指定します。
    MessageHook1.hWndHook = Me.hWnd
    ' フックするメッセージを指定します。
    MessageHook1.HookEnabled(WM_GETMINMAXINFO) = True
End Sub

Private Sub MessageHook1_Message(wMsg As Long, wParam As Long, lParam As Long, bDiscard As Boolean, lResult As Long)
    ' 変数の宣言。
    Dim info As MINMAXINFO
    
    ' パラメータをローカル変数にコピーします。
    mhGetData lParam:=lParam, DestBuffer:=info, BufferSize:=LenB(info)
    ' パラメータを変更します。
    With info
        .ptMaxSize.x = 300        ' 最大化したときの幅。
        .ptMaxSize.y = 300        ' 最大化したときの高さ。
        .ptMaxTrackSize.x = 300   ' サイズ変更したときの最大幅。
        .ptMaxTrackSize.y = 300   ' サイズ変更したときの最大の高さ。
        .ptMinTrackSize.x = 100   ' サイズ変更したときの最小幅。
        .ptMinTrackSize.y = 100   ' サイズ変更したときの最小の高さ。
    End With
    ' 変数を書き戻して、変更を反映させます。
    mhSetData lParam:=lParam, SrcBuffer:=info, BufferSize:=LenB(info)
    ' Visual Basic へメッセージを送らないようにします (内部機構との競合を防ぐため)。
    bDiscard = True
End Sub