UDF > WinAPIEx > System > Windows >


_WinAPI_CallWindowProc

Transmet les informations Hook de la procédure Hook suivante dans la chaîne de Hook courante

#include <WinAPISysWin.au3>
_WinAPI_CallWindowProc ( $pPrevWndFunc, $hWnd, $iMsg, $wParam, $lParam )

Paramètres

$pPrevWndFunc Pointeur sur la procédure de la fenêtre précédente.
Si cette valeur est obtenue en appelant la fonction _WinAPI_GetWindowLong() avec le paramètre $iIndex définit sur $GWL_WNDPROC ou $DWL_DLGPROC, elle est actuellement l'adresse d'une procédure de fenêtre ou d'une boîte de dialoque, ou une valeur interne spéciale significative seulement pour _WinAPI_CallWindowProc().
$hWnd Handle de la procédure de fenêtre qui recoit le message
$iMsg Spécifie le message
$wParam Fournit des informations spécifiques à un message supplémentaire. Le contenu de ce paramètre dépend de la valeur du paramètre $iMsg
$lParam Fournit des informations spécifiques à un message supplémentaire. Le contenu de ce paramètre dépend de la valeur du paramètre $iMsg

Valeur de retour

Retourne la valeur de retour qui indique le résultat du traitement du message et qui dépend du message envoyé.

Remarques

Utilisez la fonction _WinAPI_CallWindowProc() pour des fenêtres de sous-classées. Habituellement, toutes les fenêtres de la même classe partage une procédure de fenêtre.
Une sous-classe est une fenêtre ou un ensemble de fenêtres avec la même classe dont les messages sont interceptés et traités par une autre procédure de fenêtre (ou procédures) avant d'être transmis à la procédure de fenêtre de la classe.

La fonction _WinAPI_SetWindowLong() crée la sous-classe en modifiant la procédure de fenêtre associée à une fenêtre particulière, contraignant le système à appeler la nouvelle procédure de fenêtre à la place d'une précédente.
Une application doit passer tous les messages non traités par la nouvelle procédure de fenêtre à la procédure de fenêtre précédente en appelant _WinAPI_CallWindowProc().
Cela permet à l'application de créer une chaîne de procédures de fenêtre.

En relation

_WinAPI_SetWindowLong

Voir aussi

Consultez CallWindowProc dans la librairie MSDN.

Exemple

#include <GUIConstantsEx.au3>
#include <GuiEdit.au3>
#include <GuiMenu.au3>
#include <WinAPIDlg.au3>
#include <WinAPISysWin.au3>
#include <WindowsConstants.au3>

Global $g_idContextMenu, $g_idCommonMenuItem, $g_idFileMenuItem, $g_idExitMenuItem
Global $g_hGui, $g_idInput, $g_hProcOld

Example()

Func Example()
    Local $idInput2, $hProcNew, $idDummyMenu

    $g_hGui = GUICreate("Tapez ou collez du texte", 400, 200, -1, -1, $WS_THICKFRAME, -1)
    $g_idInput = GUICtrlCreateInput("", 20, 20, 360, 20)
    $idInput2 = GUICtrlCreateInput("", 20, 50, 360, 20)

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

    $hProcNew = DllCallbackRegister("_MyWindowProc", "ptr", "hwnd; uint; longtemps; ptr")
    $g_hProcOld = _WinAPI_SetWindowLong(GUICtrlGetHandle($g_idInput), $GWL_WNDPROC, DllCallbackGetPtr($hProcNew))
    _WinAPI_SetWindowLong(GUICtrlGetHandle($idInput2), $GWL_WNDPROC, DllCallbackGetPtr($hProcNew))
    ; _WinAPI_SetWindowLong (GUICtrlGetHandle (g_idInput3 $) $GWL_WNDPROC, DllCallbackGetPtr ($hProcNew)) et ainsi de suite

    $idDummyMenu = GUICtrlCreateDummy()
    $g_idContextMenu = GUICtrlCreateContextMenu($idDummyMenu)
    $g_idCommonMenuItem = GUICtrlCreateMenuItem("Common", $g_idContextMenu)
    $g_idFileMenuItem = GUICtrlCreateMenuItem("File", $g_idContextMenu)
    GUICtrlCreateMenuItem("", $g_idContextMenu)
    $g_idExitMenuItem = GUICtrlCreateMenuItem("Exit", $g_idContextMenu)

    GUISetState(@SW_SHOW)
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
EndFunc   ;==>Example

Func do_clever_stuff_with_clipboard($hWnd)
    Local $sData
    $sData = ClipGet()
    If @error Then Return 0; Les données ne sont pas du texte ou vide
    ; Faire ça ou autre chose
    $sData = StringUpper($sData)
    ; Définit le texte
    GUICtrlSetData(_WinAPI_GetDlgCtrlID($hWnd), $sData); ou _GUICtrlEdit_SetText ($hWnd, $sData)
    Return 1
EndFunc   ;==>do_clever_stuff_with_clipboard

; Affiche un menu dans la fenêtre GUI donnée qui appartient à un ctrl GUI donné
Func ShowMenu($hWnd, $idContext)
    Local $iSelected = _GUICtrlMenu_TrackPopupMenu(GUICtrlGetHandle($idContext), $hWnd, -1, -1, -1, -1, 2)
    Switch $iSelected
        Case $g_idCommonMenuItem
            ConsoleWrite("Common" & @CRLF)
        Case $g_idFileMenuItem
            ConsoleWrite("File" & @CRLF)
        Case $g_idExitMenuItem
            ConsoleWrite("Exit" & @CRLF)
    EndSwitch
EndFunc   ;==>ShowMenu

Func _MyWindowProc($hWnd, $iMsg, $wParam, $lParam)
    Switch $iMsg
        Case $WM_PASTE
            Return do_clever_stuff_with_clipboard($hWnd)
        Case $WM_CONTEXTMENU
            If $hWnd = GUICtrlGetHandle($g_idInput) Then
                ShowMenu($g_hGui, $g_idContextMenu)
                Return 0
            EndIf
        Case $WM_SETCURSOR
            GUICtrlSetCursor(_WinAPI_GetDlgCtrlID($hWnd), 5); ; Définit le curseur à IBEAM
            Return 1; and don't let default windowproc mess things up
    EndSwitch

    ; Transmet les messages non gérées à WindowProc par défaut
    Return _WinAPI_CallWindowProc($g_hProcOld, $hWnd, $iMsg, $wParam, $lParam)
EndFunc   ;==>_MyWindowProc