Das geht so:
AutoIt
#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 74)
#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
Alles anzeigen
Edit:
Und hier findest du das Prinzip in einer UDF angewendet: https://autoit.de/index.php/Thre…8292#post258292