找回密码
 加入
搜索
楼主: smooth

[AU3基础] [已解决]GUICtrlCreateMenuItem右键菜单怎么隐藏

[复制链接]
发表于 2022-4-6 09:11:25 | 显示全部楼层
smooth 发表于 2022-4-6 08:30
我把1楼的代码改为完整版的了,直接复制下来就可以测试了。

接下来要
1,修改 GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUIRegisterMsg($WM_CONTEXTMENU, "WM_CONTEXTMENU")
2,右键点击列表条目数据才显示右键菜单,不是点击列表就显示右键菜单
3,复制点击列表条目的行或列数据
 楼主| 发表于 2022-4-6 09:14:39 | 显示全部楼层
chzj589 发表于 2022-4-6 09:11
接下来要
1,修改 GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUIRegisterMsg($WM_CONTEXTMENU, "WM_ ...

1、不用修改GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUIRegisterMsg($WM_CONTEXTMENU, "WM_CONTEXTMENU")

2、点击列表就显示右键?这是什么操作,当然是点击右键才出来右键菜单。你的需求我不是很理解。
发表于 2022-4-6 09:23:02 | 显示全部楼层
smooth 发表于 2022-4-6 09:14
1、不用修改GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUIRegisterMsg($WM_CONTEXTMENU, "WM_CONTEXTM ...

怪事,我怎么点击没反映,右键菜单不显示?
发表于 2022-4-6 09:25:42 | 显示全部楼层
smooth 发表于 2022-4-6 09:14
1、不用修改GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUIRegisterMsg($WM_CONTEXTMENU, "WM_CONTEXTM ...

2,右键点击列表条目数据才显示右键菜单,不是点击列表就显示右键菜单
就鼠标点击条目有数据才显示右键菜单,点击空格就不显示
 楼主| 发表于 2022-4-6 09:51:45 | 显示全部楼层
chzj589 发表于 2022-4-6 09:25
2,右键点击列表条目数据才显示右键菜单,不是点击列表就显示右键菜单
就鼠标点击条目有数据才显示右键 ...

我的点击空白的条目,也可以显示右键菜单的,只要ListView不为空。
发表于 2022-4-6 10:05:57 | 显示全部楼层
smooth 发表于 2022-4-6 09:51
我的点击空白的条目,也可以显示右键菜单的,只要ListView不为空。

修改一下,你试试:

#include <GuiListView.au3>
#include <WindowsConstants.au3>
#include <GuiMenu.au3>
Opt("GuiOnEventMode", 1)
Global Enum $idOpen = 1000
Global $idGui = GUICreate("", 420, 500)
DllCall("uxtheme.dll", "none", "SetThemeAppProperties", "int", 0)
Global $idListview = GUICtrlCreateListView("", 10, 50, 400, 156, BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS))
GUICtrlSetBkColor(-1, 0xFFFBF0)
$iStyle = BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $WS_EX_CLIENTEDGE, $LVS_EX_INFOTIP, $LVS_EX_SUBITEMIMAGES)
_GUICtrlListView_SetExtendedListViewStyle($idListview, $iStyle) ;设置扩展样式
DllCall("uxtheme.dll", "none", "SetThemeAppProperties", "int", 7)
_GUICtrlListView_AddColumn($idListview, "值", 60)
_GUICtrlListView_AddColumn($idListview, "域", 230)
Global $hListview = GUICtrlGetHandle($idListview)
GUISetState()
GUISetOnEvent(-3, "_Exit")
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUIRegisterMsg($WM_CONTEXTMENU, "WM_CONTEXTMENU")
Global $aArrayList[5][2] = [["状态", "证书有效"], ["序列号", "ABCDEFGH"], ["持有者", "DDDDDDDDD"], ["指纹", "GGGGGGGGGGG"], ["有效期", "20220406"]]
_GUICtrlListView_AddArray($idListview, $aArrayList)
;_Key_GuiSetData()
While 1
        Sleep(10)
WEnd
Func _CopyItems()
        ;MsgBox(0, 0, "右键菜单测试。如果把数组$aArrayList清空,则不会弹出右键菜单!", "", $idGui)
        $index = _GUICtrlListView_GetSelectedIndices($idListview)
        $index1 = $index + 1
        Local $cont = _GUICtrlListView_GetItemCount($hListview)
        $h1 = 0
        For $id = 0 To $cont - 1
                $str = _GUICtrlListView_GetItemTextArray($hListview, $index)
                $h1 = $str[1]
                $h2 = $str[2]
                $hA2 = $h1 & " , " & $h2
        Next
        MsgBox(0, "复制 " & $index1 & " 行", $hA2)
EndFunc   ;==>_CopyItems
Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam) 
        Local $hWndFrom, $iCode
        $hWndFrom = $ilParam
        $iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
        $iCode = BitShift($iwParam, 16) ; Hi Word
        Switch $iwParam
                Case $idOpen
                        _CopyItems()
        EndSwitch
EndFunc   ;==>WM_COMMAND
Func WM_CONTEXTMENU($hWnd, $iMsg, $iwParam, $ilParam)
        Local $gUK_Text
        Local $iCols = _GUICtrlListView_GetColumnCount($idListview) ;检索列表视图列数
        Local $iRows = _GUICtrlListView_GetItemCount($idListview) ;检索列表视图行数
        For $i = 0 To $iRows - 1
                For $j = 0 To $iCols - 1
                        If _GUICtrlListView_GetItemText($idListview, $i, $j) = "证书有效" Then
                                $gUK_Text = "证书有效"
                                ExitLoop
                        EndIf
                Next
        Next
        Switch $iwParam
                Case $hListview ;必须是句柄才行,不能是是控件的ID
                        $index = _GUICtrlListView_GetSelectedIndices($hListview)
                        If $index <> "" Then
                                Local $hMenu = _GUICtrlMenu_CreatePopup() ;创建下拉菜单, 子菜单或快捷菜单.
                                _GUICtrlMenu_InsertMenuItem($hMenu, 0, "复制", $idOpen) ;插入一个新菜单项到指定位置.(使用参数)
                                _GUICtrlMenu_TrackPopupMenu($hMenu, $hWnd) ;在指定位置显示一个快捷菜单
                                _GUICtrlMenu_DestroyMenu($hMenu) ;销毁指定菜单, 并释放菜单占用的内存
                                Return True
                        Else
                                MsgBox(0, "右键点击", "你点击的是空格")
                        EndIf
        EndSwitch
EndFunc   ;==>WM_CONTEXTMENU1
Func _Exit()
        Exit
EndFunc   ;==>_Exit
 楼主| 发表于 2022-4-6 10:22:16 | 显示全部楼层
chzj589 发表于 2022-4-6 10:05
修改一下,你试试:

不错,比较完善了。但是有个问题,你选择多行,然后复制试试。

另外,你可以加上,接受Ctrl+C和Ctrl+A。就可以完善了。
发表于 2022-4-6 10:41:14 | 显示全部楼层
smooth 发表于 2022-4-6 10:22
不错,比较完善了。但是有个问题,你选择多行,然后复制试试。

另外,你可以加上,接受Ctrl+C和Ctrl+A ...

你能操作就好了。
 楼主| 发表于 2022-4-6 15:08:33 | 显示全部楼层
chzj589 发表于 2022-4-6 10:41
你能操作就好了。

DllCall("uxtheme.dll", "none", "SetThemeAppProperties", "int", 0)
DllCall("uxtheme.dll", "none", "SetThemeAppProperties", "int", 7)
请教一下,这两句语句具体怎么用法?百度没有查到相关资料。第一句是开头,然后以最后一句作为结束吗?
我试了不要最后一句,也可以。
发表于 2022-4-6 15:18:47 | 显示全部楼层
smooth 发表于 2022-4-6 15:08
DllCall("uxtheme.dll", "none", "SetThemeAppProperties", "int", 0)
DllCall("uxtheme.dll", "none",  ...

是返回。如不用后面这句也可以。但下面的代码如MsgBox(0, "AA", “”)窗口格式也会改变。


多行复制。热键=Shift-Alt-a

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2022-4-6 16:44:24 | 显示全部楼层
本帖最后由 smooth 于 2022-4-6 16:48 编辑
chzj589 发表于 2022-4-6 15:18
是返回。如不用后面这句也可以。但下面的代码如MsgBox(0, "AA", “”)窗口格式也会改变。

多行复制不难,我昨天就搞好了。但是可能你的方法更好一点,以下是我的代码。你方便就把你的放上来,我学习一下:
 Local $iCols = _GUICtrlListView_GetColumnCount($idListview) ;检索列表视图列数
 If (_GUICtrlListView_GetSelectedCount($idListview)) Then ;确定列表视图选中项目数
  $a_Indices = _GUICtrlListView_GetSelectedIndices($idListview, 1) ;检索选定项目的索引,返回数组。
  Local $gText
  For $i = 1 To $a_Indices[0]  ; 把被选中的项目列出来
   $gText &= _GUICtrlListView_GetItemText($idListview, $a_Indices[$i], 0) & ":" & _GUICtrlListView_GetItemText($idListview, $a_Indices[$i], 1) & @CRLF;被选中项目的第一行,第一列
   ClipPut($gText)
  Next
 EndIf
EndFunc   ;==>_CopyItems

难点是Ctl+C和Ctrl+A,不能使用热键,否则脚本不退出,就一直复制Listview的内容。
我百度查了C++的写法,改成AU3的写法,注册了几个Windows消息函数,到了最后,不知道怎么响应$WM_COPY消息。

发表于 2022-4-6 17:19:24 | 显示全部楼层
smooth 发表于 2022-4-6 16:44
多行复制不难,我昨天就搞好了。但是可能你的方法更好一点,以下是我的代码。你方便就把你的放上来,我学 ...

HotKeySet("c", "_CopyItems"),应该可行
发表于 2022-4-7 00:08:52 | 显示全部楼层
smooth 发表于 2022-4-6 07:05
嗯,只滑动鼠标,不用按住CTRL键,可以么?

目前不行,加上Ctrl 是用來鼠標多選項目的
 楼主| 发表于 2022-4-7 08:23:32 | 显示全部楼层
chzj589 发表于 2022-4-6 17:19
HotKeySet("c", "_CopyItems"),应该可行

大佬,你复制多行,是怎么写的?代码能看一下吗,我这个写法,列数少还可以,但是不能通用,如果有100列,就没法玩了。

另外,你说的HotKeySet("c", "_CopyItems"),是按哪个组合键,光按C不行吧?
发表于 2022-4-7 09:17:12 | 显示全部楼层
smooth 发表于 2022-4-7 08:23
大佬,你复制多行,是怎么写的?代码能看一下吗,我这个写法,列数少还可以,但是不能通用,如果有100列 ...

HotKeySet("c", "_CopyItems")是热鍵,按C鍵。
HotKeySet("+a", "_CopyItems")是组合鍵,按<Shift + a>鍵
复制多行时用读取数组返回列表
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-4 10:23 , Processed in 0.071340 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表