Advertisement
BugFix

Untitled

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