TimRude Posted November 7, 2022 Share Posted November 7, 2022 I'm working on coding a GUI that includes a ListView control created using _GUICtrlListView_Create(). The ListView is used to display thumbnails of image files found in a specified folder. When a user left-clicks on a thumbnail, the thumbnail is selected and the image is displayed on another GUI window. Since this is only a simple viewer app whose sole function is the display of the images, there is no right-click action (i.e. context menu) wanted in the app. So I want to disable the right-click functionality in the ListView. Currently, right-clicking on a thumbnail in the ListView selects it, but I don't act on the click. I only act on a left-click on a thumbnail. To avoid user confusion, I'd like to make it where right-clicking in the ListView is totally ignored and doesn't do anything at all (i.e doesn't change which thumbnail (if any) is selected). I've got GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") in the GUI definition, and the WM_NOTIFY function monitors all messages from the ListView. I can see where I'm getting the $NM_RCLICK message when the ListView is right-clicked, but I don't know what I need to do to prevent that right-click from triggering the default behavior (or any behavior) in the ListView. As an example, if you run the sample script in the help topic for _GUICtrlListView_Create, it reacts to the right-click on a ListView item. What would I need to do in that script to make a right-click in the ListView do absolutely nothing? Link to comment Share on other sites More sharing options...
Nine Posted November 7, 2022 Share Posted November 7, 2022 In the example you linked, there is a comment in the $NM_RCLICK case. Please read it, it tells how to disable the default processing of the right-click (hint : return 1) “They did not know it was impossible, so they did it” ― Mark Twain Spoiler Block all input without UAC Save/Retrieve Images to/from Text Monitor Management (VCP commands) Tool to search in text (au3) files Date Range Picker Virtual Desktop Manager Sudoku Game 2020 Overlapped Named Pipe IPC HotString 2.0 - Hot keys with string x64 Bitwise Operations Multi-keyboards HotKeySet Recursive Array Display Fast and simple WCD IPC Multiple Folders Selector Printer Manager GIF Animation (cached) Screen Scraping Multi-Threading Made Easy Link to comment Share on other sites More sharing options...
TimRude Posted November 7, 2022 Author Share Posted November 7, 2022 I've already read that and tried it since it sounded like it would do what I wanted. But it doesn't prevent the right-click from selecting what is right-clicked on. That's the default processing I want to prevent. Case $NM_RCLICK ; Sent by a list-view control when the user clicks an item with the right mouse button ;_WM_NOTIFY_DebugEvent("$NM_RCLICK", $tagNMITEMACTIVATE, $lParam, "IDFrom,,Index,SubItem,NewState,OldState,Changed,ActionX,ActionY,lParam,KeyFlags") Return 1 ; not to allow the default processing ;Return 0 ; allow the default processing Link to comment Share on other sites More sharing options...
Solution pixelsearch Posted November 7, 2022 Solution Share Posted November 7, 2022 @TimRude try to subclass the listview, it should intercept the right-click before it reaches it : expandcollapse popup#include <GUIConstantsEx.au3> #include <GuiImageList.au3> #include <GuiListView.au3> #include <WindowsConstants.au3> #include <WinAPIShellEx.au3> OnAutoItExitRegister('OnAutoItExit') Global $g_hListView ; Register DLL callback that will be used as window subclass procedure Global $g_hDll = DllCallbackRegister('_SubclassProc', 'lresult', 'hwnd;uint;wparam;lparam;uint_ptr;dword_ptr') Global $g_pDll = DllCallbackGetPtr($g_hDll) Example() Func Example() Local $hGUI, $hImage $hGUI = GUICreate("ListView Create (v" & @AutoItVersion & ")", 400, 300) $g_hListView = _GUICtrlListView_Create($hGUI, "", 2, 2, 394, 268) _GUICtrlListView_SetExtendedListViewStyle($g_hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES)) ; Install window subclass callback _WinAPI_SetWindowSubclass($g_hListView, $g_pDll, 1000, 0) GUISetState(@SW_SHOW) ; Load images $hImage = _GUIImageList_Create() _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($g_hListView, 0xFF0000, 16, 16)) _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($g_hListView, 0x00FF00, 16, 16)) _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($g_hListView, 0x0000FF, 16, 16)) _GUICtrlListView_SetImageList($g_hListView, $hImage, 1) ; Add columns _GUICtrlListView_InsertColumn($g_hListView, 0, "Column 1", 100) _GUICtrlListView_InsertColumn($g_hListView, 1, "Column 2", 100) _GUICtrlListView_InsertColumn($g_hListView, 2, "Column 3", 100) ; Add items _GUICtrlListView_AddItem($g_hListView, "Row 1: Col 1", 0) _GUICtrlListView_AddSubItem($g_hListView, 0, "Row 1: Col 2", 1) _GUICtrlListView_AddSubItem($g_hListView, 0, "Row 1: Col 3", 2) _GUICtrlListView_AddItem($g_hListView, "Row 2: Col 1", 1) _GUICtrlListView_AddSubItem($g_hListView, 1, "Row 2: Col 2", 1) _GUICtrlListView_AddItem($g_hListView, "Row 3: Col 1", 2) Do Until GUIGetMsg() = $GUI_EVENT_CLOSE GUIDelete() EndFunc ;==>Example Func _SubclassProc($hWnd, $iMsg, $wParam, $lParam, $iID, $pData) #forceref $iID, $pData If $iMsg = $WM_RBUTTONDOWN Then Return 0 Return _WinAPI_DefSubclassProc($hWnd, $iMsg, $wParam, $lParam) EndFunc ;==>_SubclassProc Func OnAutoItExit() _WinAPI_RemoveWindowSubclass($g_hListView, $g_pDll, 1000) DllCallbackFree($g_hDll) EndFunc ;==>OnAutoItExit TimRude, KaFu and dmob 2 1 Link to comment Share on other sites More sharing options...
TimRude Posted November 7, 2022 Author Share Posted November 7, 2022 1 hour ago, pixelsearch said: @TimRude try to subclass the listview, it should intercept the right-click before it reaches it @pixelsearch That's the ticket! In my VB6 programming, I've often had to dabble in the dark art of subclassing but I didn't know how or if it was possible to do it with AutoIt. Now with your concise example I can familiarize myself with the steps involved. Thanks for the info! Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now