Advertisement
BugFix

Hook WM-Message

Feb 1st, 2015
441
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 5.25 KB | None | 0 0
  1. ;-- TIME_STAMP   2014-07-30 17:37:42
  2.  
  3. #cs
  4.     WM_ -Message Hook
  5.     - Nachricht wird erst in einer eigenen Funktion ausgewertet
  6.     - dann an das System zurückgegeben (auswertbar mit GUIRegisterMsg)
  7.     - oder verworfen ("Return 0" nach Msg-Auswertung in _WinProc, s. Zeile 76)
  8. #ce
  9.  
  10. #include <GuiImageList.au3>
  11. #include <GuiListView.au3>
  12. #include <ListViewConstants.au3>
  13. #include <StructureConstants.au3>
  14. #include <WinAPI.au3>
  15. #include <WindowsConstants.au3>
  16.  
  17. ;~ Local Const $GWL_WNDPROC = -4
  18.  
  19. $hGui = GUICreate("Test", 400, 400)
  20. $hListView = _GUICtrlListView_Create($hGui, "Listview", 10, 10, 380, 380)
  21. _GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
  22.  
  23. ; Load images
  24. $hImage = _GUIImageList_Create()
  25. _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0xFF0000, 16, 16))
  26. _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x00FF00, 16, 16))
  27. _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x0000FF, 16, 16))
  28. _GUICtrlListView_SetImageList($hListView, $hImage, 1)
  29.  
  30. ; Add columns
  31. _GUICtrlListView_InsertColumn($hListView, 0, "Column 1", 100)
  32. _GUICtrlListView_InsertColumn($hListView, 1, "Column 2", 100)
  33. _GUICtrlListView_InsertColumn($hListView, 2, "Column 3", 100)
  34.  
  35. ; Add items
  36. _GUICtrlListView_AddItem($hListView, "Row 1: Col 1", 0)
  37. _GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 2", 1)
  38. _GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 3", 2)
  39. _GUICtrlListView_AddItem($hListView, "Row 2: Col 1", 1)
  40. _GUICtrlListView_AddSubItem($hListView, 1, "Row 2: Col 2", 1)
  41. _GUICtrlListView_AddItem($hListView, "Row 3: Col 1", 2)
  42. GUISetState()
  43.  
  44. ;
  45. $hProc = DllCallbackRegister('_WinProc', 'ptr', 'hwnd;uint;wparam;lparam')         ; == hier registriere ich die Funktion "_WinProc" als Callback, Returntype ist "ptr", Parametertypen
  46. $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
  47.  
  48. GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
  49.  
  50.  
  51. While GUIGetMsg() <> -3
  52.     Sleep(10)
  53. WEnd
  54.  
  55. _WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, $hHook)                                 ; == nach Programmende: originale WinProc wiederherstellen
  56. DllCallbackFree($hProc)
  57.  
  58. Func _WinProc($hWnd, $iMsg, $iwParam, $ilParam)                                    ; == die Prozedur soll ausschließlich WM_NOTIFY auswerten
  59.     ; wenn nicht die gewünschte Msg kommt - Rückgabe an System                     ; == andere Messages werden gleich durchgereicht ans System zur Auswertung
  60.     If $iMsg <> $WM_NOTIFY Then Return _WinAPI_CallWindowProc($hHook, $hWnd, $iMsg, $iwParam, $ilParam)
  61.  
  62.     Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
  63.     $hWndListView = $hListView
  64.     If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)
  65.  
  66.     $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
  67.     $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
  68.     $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
  69.     $iCode = DllStructGetData($tNMHDR, "Code")
  70.     Switch $hWndFrom
  71.         Case $hWndListView
  72.             Switch $iCode
  73.                 Case $LVN_COLUMNCLICK ; A column was clicked                       ; == Ich möchte nicht, dass diese Msg verwertet werden kann und verwerfe sie
  74.                     $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
  75.                     ConsoleWrite('MyProc: $LVN_COLUMNCLICK -->Column: ' & DllStructGetData($tInfo, "SubItem") & @CRLF)
  76.                     Return 0 ; <== Nachricht wird jetzt verworfen und kann über GUIRegisterMsg nicht verwertet werden
  77.  
  78.                 Case $NM_CLICK                                                     ; == Diese Msg lasse ich durch ans System
  79.                     $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
  80.                     ConsoleWrite("MyProc: $NM_CLICK " & "-->Index: " & DllStructGetData($tInfo, "Index") & _
  81.                                             "  -->SubItem: " & DllStructGetData($tInfo, "SubItem") & @CRLF)
  82.             EndSwitch
  83.     EndSwitch
  84.     ; jetzt wird die normale WinProc aufgerufen, die man mit GuiRegisterMsg auswerten kann
  85.     Return _WinAPI_CallWindowProc($hHook, $hWnd, $iMsg, $iwParam, $ilParam)
  86. EndFunc   ;==>_WinProc
  87.  
  88.  
  89. Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
  90.     Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
  91.     $hWndListView = $hListView
  92.     If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)
  93.     $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
  94.     $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
  95.     $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
  96.     $iCode = DllStructGetData($tNMHDR, "Code")
  97.     Switch $hWndFrom
  98.         Case $hWndListView
  99.             Switch $iCode
  100.                 Case $LVN_COLUMNCLICK ; A column was clicked <== Diese Nachricht erreicht die Funktion nicht mehr
  101.                     Local $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
  102.                     ConsoleWrite('GUIRegisterMsg: $LVN_COLUMNCLICK -->Column: ' & DllStructGetData($tInfo, "SubItem") & @CRLF)
  103.                 Case $NM_CLICK ; Sent by a list-view control when the user clicks an item with the left mouse button
  104.                     Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
  105.                     ConsoleWrite("GUIRegisterMsg: $NM_CLICK " & "-->Index: " & DllStructGetData($tInfo, "Index") & _
  106.                                             "  -->SubItem: " & DllStructGetData($tInfo, "SubItem") & @CRLF)
  107.             EndSwitch
  108.     EndSwitch
  109.     Return 0
  110. EndFunc   ;==>WM_NOTIFY
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement