Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #cs
- WM_ -Message Hook
- - Nachricht wird erst in einer eigenen Funktion ausgewertet
- - dann an das System zurückgegeben (auswertbar mit GUIRegisterMsg)
- - oder verworfen ("Return 0" nach Msg-Auswertung in _WinProc, s. Zeile 76)
- #ce
- #include <GuiImageList.au3>
- #include <GuiListView.au3>
- #include <ListViewConstants.au3>
- #include <StructureConstants.au3>
- #include <WinAPI.au3>
- #include <WindowsConstants.au3>
- ;~ Local Const $GWL_WNDPROC = -4
- $hGui = GUICreate("Test", 400, 400)
- $hListView = _GUICtrlListView_Create($hGui, "Listview", 10, 10, 380, 380)
- _GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
- ; Load images
- $hImage = _GUIImageList_Create()
- _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0xFF0000, 16, 16))
- _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x00FF00, 16, 16))
- _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x0000FF, 16, 16))
- _GUICtrlListView_SetImageList($hListView, $hImage, 1)
- ; Add columns
- _GUICtrlListView_InsertColumn($hListView, 0, "Column 1", 100)
- _GUICtrlListView_InsertColumn($hListView, 1, "Column 2", 100)
- _GUICtrlListView_InsertColumn($hListView, 2, "Column 3", 100)
- ; Add items
- _GUICtrlListView_AddItem($hListView, "Row 1: Col 1", 0)
- _GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 2", 1)
- _GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 3", 2)
- _GUICtrlListView_AddItem($hListView, "Row 2: Col 1", 1)
- _GUICtrlListView_AddSubItem($hListView, 1, "Row 2: Col 2", 1)
- _GUICtrlListView_AddItem($hListView, "Row 3: Col 1", 2)
- GUISetState()
- ;
- $hProc = DllCallbackRegister('_WinProc', 'ptr', 'hwnd;uint;wparam;lparam') ; == hier registriere ich die Funktion "_WinProc" als Callback, Returntype ist "ptr", Parametertypen
- $hHook = _WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, DllCallbackGetPtr($hProc)) ; == hier wird dem Fenster die Adresse der Callback-Prozedur übergeben, diese ersetzt jetzt die Standard-Window-Prozedur
- GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
- While GUIGetMsg() <> -3
- Sleep(10)
- WEnd
- _WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, $hHook) ; == nach Programmende: originale WinProc wiederherstellen
- DllCallbackFree($hProc)
- Func _WinProc($hWnd, $iMsg, $iwParam, $ilParam) ; == die Prozedur soll ausschließlich WM_NOTIFY auswerten
- ; wenn nicht die gewünschte Msg kommt - Rückgabe an System ; == andere Messages werden gleich durchgereicht ans System zur Auswertung
- If $iMsg <> $WM_NOTIFY Then Return _WinAPI_CallWindowProc($hHook, $hWnd, $iMsg, $iwParam, $ilParam)
- Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
- $hWndListView = $hListView
- If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)
- $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
- $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
- $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
- $iCode = DllStructGetData($tNMHDR, "Code")
- Switch $hWndFrom
- Case $hWndListView
- Switch $iCode
- Case $LVN_COLUMNCLICK ; A column was clicked ; == Ich möchte nicht, dass diese Msg verwertet werden kann und verwerfe sie
- $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
- ConsoleWrite('MyProc: $LVN_COLUMNCLICK -->Column: ' & DllStructGetData($tInfo, "SubItem") & @CRLF)
- Return 0 ; <== Nachricht wird jetzt verworfen und kann über GUIRegisterMsg nicht verwertet werden
- Case $NM_CLICK ; == Diese Msg lasse ich durch ans System
- $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
- ConsoleWrite("MyProc: $NM_CLICK " & "-->Index: " & DllStructGetData($tInfo, "Index") & _
- " -->SubItem: " & DllStructGetData($tInfo, "SubItem") & @CRLF)
- EndSwitch
- EndSwitch
- ; jetzt wird die normale WinProc aufgerufen, die man mit GuiRegisterMsg auswerten kann
- Return _WinAPI_CallWindowProc($hHook, $hWnd, $iMsg, $iwParam, $ilParam)
- EndFunc ;==>_WinProc
- Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
- Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
- $hWndListView = $hListView
- If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)
- $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
- $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
- $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
- $iCode = DllStructGetData($tNMHDR, "Code")
- Switch $hWndFrom
- Case $hWndListView
- Switch $iCode
- Case $LVN_COLUMNCLICK ; A column was clicked <== Diese Nachricht erreicht die Funktion nicht mehr
- Local $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
- ConsoleWrite('GUIRegisterMsg: $LVN_COLUMNCLICK -->Column: ' & DllStructGetData($tInfo, "SubItem") & @CRLF)
- Case $NM_CLICK ; Sent by a list-view control when the user clicks an item with the left mouse button
- Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
- ConsoleWrite("GUIRegisterMsg: $NM_CLICK " & "-->Index: " & DllStructGetData($tInfo, "Index") & _
- " -->SubItem: " & DllStructGetData($tInfo, "SubItem") & @CRLF)
- EndSwitch
- EndSwitch
- Return 0
- EndFunc ;==>WM_NOTIFY
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement