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