Funktionreferenz


_WinAPI_CallWindowProc

Beschreibung anzeigen in

Ü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 )

Parameter

$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.

Rückgabewert

Gibt den Rückgabewert der vom Ergebnis der Meldungsbehandlung bestimmt wird zurück. Dies hängt von der versendeten Meldung ab.

Bemerkungen

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.

Verwandte Funktionen

_WinAPI_SetWindowLong

Siehe auch

Suche nach CallWindowProc in der MSDN Bibliothek.

Beispiel

#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