Function Reference

_WinAPI_CallWindowProc

指定されたウィンドウプロシージャにメッセージ情報を渡します。

#Include <WinAPI.au3>
_WinAPI_CallWindowProc($lpPrevWndFunc, $hWnd, $Msg, $wParam, $lParam)

 

パラメータ

$lpPrevWndFunc 前のウィンドウプロシージャへのポインタ
  この値が$iIndexパラメータに$GWL_WNDPROC、$DWL_DLGPROCを設定した_WinAPI_GetWindowLong関数の呼び出しによって得られたものである場合、
  実際にはウィンドウのアドレス、ダイアログボックスプロシージャ、または_WinAPI_CallWindowProcでだけ有効な特別な内部値のいずれかです
$hWnd メッセージを受け取るウィンドウプロシージャのハンドル
$Msg メッセージを指定します
$wParam 追加メッセージ固有の情報を指定します。このパラメータの内容はMsgパラメータの値に依存します
$lParam 追加メッセージ固有の情報を指定します。このパラメータの内容はMsgパラメータの値に依存します

 

返し値

メッセージ処理の結果を指定し、送信メッセージに依存する返し値を返します。

 

注意

_WinAPI_CallWindowProc関数はウィンドウをサブクラス化するために使用します。
通常、同じクラスのウィンドウは全て1つのウィンドウプロシージャを共有します。
サブクラスはクラスのウィンドウプロシージャにメッセージが渡される前に
メッセージの受け取りと処理がおこなわれる(1 つまたは複数の)別のウィンドウプロシージャを持つ
同じクラスのウィンドウのセットまたはウィンドウです

_WinAPI_SetWindowLong関数は特定のウィンドウに関連付けられているウィンドウプロシージャを変更することによりサブクラスを作成します。
この結果システムは従来のウィンドウプロシージャの代わりに新しいウィンドウプロシージャを呼び出すようになります。
アプリケーションは新しいウィンドウプロシージャが処理しないメッセージを_WinAPI_CallWindowProc関数を呼ぶことで本来のウィンドウプロシージャに渡さなければなりません。
これによってアプリケーションはウィンドウプロシージャのチェインを作成できます。

 

関連

DllCallbackRegister, _WinAPI_SetWindowLong

 

こちらも参照

MSDNライブラリでCallWindowProcを検索して下さい。

 


#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#include <GUIConstantsEx.au3>
#include <GuiEdit.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
#include <GuiMenu.au3>
#include <WinAPI.au3>

Opt('MustDeclareVars', 1)

Global $ContextMenu, $CommonMenuItem, $FileMenuItem, $ExitMenuItem
Global $hGui, $cInput, $wProcOld

_Main()

Func _Main()
    Local $cInput2, $wProcNew, $DummyMenu

    $hGui = GUICreate("Type or paste some stuff", 400, 200, -1, -1, $WS_THICKFRAME, -1)
    $cInput = GUICtrlCreateInput("", 20, 20, 360, 20)
    $cInput2 = GUICtrlCreateInput("", 20, 50, 360, 20)

    GUICtrlCreateLabel("abcd", 1, 1, 30, 18)
    GUICtrlSetCursor(-1, 9)

    $wProcNew = DllCallbackRegister("_MyWindowProc", "ptr", "hwnd;uint;long;ptr")
    $wProcOld = _WinAPI_SetWindowLong(GUICtrlGetHandle($cInput), $GWL_WNDPROC, DllCallbackGetPtr($wProcNew))
    _WinAPI_SetWindowLong(GUICtrlGetHandle($cInput2), $GWL_WNDPROC, DllCallbackGetPtr($wProcNew))
    ;_WinAPI_SetWindowLong(GUICtrlGetHandle($cInput3), $GWL_WNDPROC, DllCallbackGetPtr($wProcNew))など

    $DummyMenu = GUICtrlCreateDummy()
    $ContextMenu = GUICtrlCreateContextMenu($DummyMenu)
    $CommonMenuItem = GUICtrlCreateMenuItem("Common", $ContextMenu)
    $FileMenuItem = GUICtrlCreateMenuItem("File", $ContextMenu)
    GUICtrlCreateMenuItem("", $ContextMenu)
    $ExitMenuItem = GUICtrlCreateMenuItem("Exit", $ContextMenu)


    GUISetState(@SW_SHOW)
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop
        EndSwitch
    WEnd
EndFunc   ;==>_Main

Func do_clever_stuff_with_clipboard($hWnd)
    Local $sData
    $sData = ClipGet()
    If @error Then Return 0; クリップデータはテキストではないか、クリップは空
    ; 何かおこなう
    $sData = StringUpper($sData)
    ; テキスト設定
    GUICtrlSetData(_WinAPI_GetDlgCtrlID($hWnd), $sData);or _GUICtrlEdit_SetText($hWnd, $sData)
    Return 1
EndFunc   ;==>do_clever_stuff_with_clipboard

; 与えられたGUIウィンドウの与えられたGUIコントロールに属するメニューを表示
Func ShowMenu($hWnd, $nContextID)
    Local $iSelected = _GUICtrlMenu_TrackPopupMenu(GUICtrlGetHandle($nContextID), $hWnd, -1, -1, -1, -1, 2)
    Switch $iSelected
        Case $CommonMenuItem
            ConsoleWrite("Common" & @CRLF)
        Case $FileMenuItem
            ConsoleWrite("File" & @CRLF)
        Case $ExitMenuItem
            ConsoleWrite("Exit" & @CRLF)
    EndSwitch
EndFunc   ;==>ShowMenu

Func _MyWindowProc($hWnd, $uiMsg, $wParam, $lParam)
    Switch $uiMsg
        Case $WM_PASTE
            Return do_clever_stuff_with_clipboard($hWnd)
        Case $WM_CONTEXTMENU
            If $hWnd = GUICtrlGetHandle($cInput) Then
                ShowMenu($hGui, $ContextMenu)
                Return 0
            EndIf
        Case $WM_SETCURSOR
            GUICtrlSetCursor(_WinAPI_GetDlgCtrlID($hWnd), 5); Iビームカーソルを設定
            Return 1; デフォルトのウィンドウプロシージャにメッセージを処理させない
    EndSwitch

    ; 制御しないメッセージをデフォルトのウィンドウプロシージャに渡す
    Return _WinAPI_CallWindowProc($wProcOld, $hWnd, $uiMsg, $wParam, $lParam)
EndFunc   ;==>_MyWindowProc