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 )
$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 |
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.
Consultez CallWindowProc dans la librairie MSDN.
#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