Übergibt die "Hook"-Information an die nächste "Hook"-Prozedur in der aktuellen "Hook"-Kette
#include <WinAPISysWin.au3>
_WinAPI_CallWindowProc ( $pPrevWndFunc, $hWnd, $iMsg, $wParam, $lParam )
$pPrevWndFunc | Zeiger auf die vorherige Fensterprozedur. Falls dieser Wert durch Aufruf der Funktion _WinAPI_GetWindowLong() bestimmt wurde, wobei der $iIndex-Parameters den Wert $GWL_WNDPROC oder $DWL_DLGPROC hatte, entspricht der Zeiger entweder der Adresse einer Fenster- bzw. Dialogboxprozedur oder einem speziellen internen Wert, der nur für _WinAPI_CallWindowProc() eine Bedeutung hat. |
$hWnd | Handle zu der Fensterprozedur, die die Meldung empfängt |
$iMsg | Gibt die Meldung an |
$wParam | Gibt zusätzliche meldungsspezifische Informationen an. Der Inhalt dieses Parameters hängt vom Wert des Msg-Parameters ab. |
$lParam | Gibt zusätzliche meldungsspezifische Informationen an. Der Inhalt dieses Parameters hängt vom Wert des Msg-Parameters ab. |
Man benutzt die _WinAPI_CallWindowProc()-Funktion für die Fenstervererbung in Subklassen.
Normalerweise teilen sich alle Fenster der selben Klasse eine Fensterprozedur. Eine Subklasse enthält ein Fenster oder ein Satz von Fenstern derselben Klasse. Deren Meldungen werden von einer (und/oder mehreren) anderen Fensterprozeduren abgefangen und verarbeitet, bevor sie von der übergeordneten Fensterprozedur verarbeitet werden.
Die _WinAPI_SetWindowLong()-Funktion erzeugt eine Subklasse durch Ändern der zu dem jeweiligen Fenster gehörenden Prozedur, wodurch das System eine neue Fensterprozedur anstelle der ursprünglichen ausführt. Eine Anwendung muss alle Meldungen, die die neue Fensterprozedur nicht selbst behandelt, an die ursprüngliche Fensterprozedur durchreichen.
Dies geschieht durch Aufruf der _WinAPI_CallWindowProc()-Funktion.
Dadurch kann die Anwendung eine Kette von Fensterprozeduren erzeugen.
Suche nach CallWindowProc in der MSDN Bibliothek.
#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, $idInput, $g_hProcOld
Example()
Func Example()
Local $idInput2, $hProcNew, $idDummyMenu
$g_hGui = GUICreate("Tippt oder fügt irgendetwas ein:", 400, 200, -1, -1, $WS_THICKFRAME, -1)
$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;long;ptr")
$g_hProcOld = _WinAPI_SetWindowLong(GUICtrlGetHandle($idInput), $GWL_WNDPROC, DllCallbackGetPtr($hProcNew))
_WinAPI_SetWindowLong(GUICtrlGetHandle($idInput2), $GWL_WNDPROC, DllCallbackGetPtr($hProcNew))
; _WinAPI_SetWindowLong(GUICtrlGetHandle($idInput3), $GWL_WNDPROC, DllCallbackGetPtr($hProcNew)) ; und so weiter
$idDummyMenu = GUICtrlCreateDummy()
$g_idContextMenu = GUICtrlCreateContextMenu($idDummyMenu)
$g_idCommonMenuItem = GUICtrlCreateMenuItem("Allgemein", $g_idContextMenu)
$g_idFileMenuItem = GUICtrlCreateMenuItem("Datei", $g_idContextMenu)
GUICtrlCreateMenuItem("", $g_idContextMenu)
$g_idExitMenuItem = GUICtrlCreateMenuItem("Beenden", $g_idContextMenu)
GUISetState(@SW_SHOW)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
EndSwitch
WEnd
EndFunc ;==>Example
Func do_clever_stuff_with_clipboard($hWnd)
Local $sData
$sData = ClipGet()
If @error Then Return 0 ; Daten in der Zwischenablage sind kein Text oder Zwischenablage ist leer
; Tue irgendwas
$sData = StringUpper($sData)
; Setzt Text
GUICtrlSetData(_WinAPI_GetDlgCtrlID($hWnd), $sData) ; Oder _GUICtrlEdit_SetText($hWnd, $sData)
Return 1
EndFunc ;==>do_clever_stuff_with_clipboard
; Zeigt ein Menü im angegebenen GUI-Fenster, das zum angegebenen Control gehört
Func ShowMenu($hWnd, $nContextID)
Local $iSelected = _GUICtrlMenu_TrackPopupMenu(GUICtrlGetHandle($nContextID), $hWnd, -1, -1, -1, -1, 2)
Switch $iSelected
Case $g_idCommonMenuItem
ConsoleWrite("Allgemein" & @CRLF)
Case $g_idFileMenuItem
ConsoleWrite("Datei" & @CRLF)
Case $g_idExitMenuItem
ConsoleWrite("Beenden" & @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($idInput) Then
ShowMenu($g_hGui, $g_idContextMenu)
Return 0
EndIf
Case $WM_SETCURSOR
GUICtrlSetCursor(_WinAPI_GetDlgCtrlID($hWnd), 5) ; Setzt den Ibeam- (Text-) Cursor
Return 1 ; Und verhindere, dass die Standard-Fensterprozedur alles durcheinanderbringt
EndSwitch
; Reicht die unbehandelten Nachrichten an die Standard-Fensterprozedur weiter
Return _WinAPI_CallWindowProc($g_hProcOld, $hWnd, $iMsg, $wParam, $lParam)
EndFunc ;==>_MyWindowProc