smooth 发表于 2022-4-6 17:10:21

【已解决】Listview列表视图如何接受Ctrl+C和Ctrl+A?

本帖最后由 smooth 于 2022-4-13 06:54 编辑

Listview列表视图如何接受Ctrl+C和Ctrl+A?
百度里搜了一下,找到C++的写法,照着注册了几个消息函数,到最后不知道怎么处理$WM_COPY消息了。


#NoTrayIcon
#RequireAdmin
#PRE_UseX64 = n
#include <GuiListView.au3>
#include <WindowsConstants.au3>
#include <GuiMenu.au3>
#include <WinAPIvkeysConstants.au3>
#include <WinAPISys.au3>
Opt("GuiOnEventMode", 1)
Global Enum $idOpen = 1000 ;Listview右键
Global Static $isCtrldown = false;
Global Static $iscdown = false;
Global $idGui = GUICreate("", 420, 500)
DllCall("uxtheme.dll", "none", "SetThemeAppProperties", "int", 0)
Global $idListview = GUICtrlCreateListView("", 10, 50, 400, 136, 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, "域", 130)
Global $hListview = GUICtrlGetHandle($idListview)
GUISetState()
GUISetOnEvent(-3, "_Exit")
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") ;$WM_COMMAND:0x0111,当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗口
GUIRegisterMsg($WM_CONTEXTMENU, "WM_CONTEXTMENU") ;$WM_CONTEXTMENU:0x007B,当用户某个窗口中点击了一下右键就发送此消息给这个窗口
Global $aArrayList = [["状态", "证书有效"], ["序列号", "ABCDEFGH"], ["持有者", "DDDDDDDDD"], ["指纹", "GGGGGGGGGGG"], ["有效期", "20220406"]]
_GUICtrlListView_AddArray($idListview, $aArrayList)
;在列表框上按键被按下
GUIRegisterMsg($WM_VKEYTOITEM, "WM_VKEYTOITEM") ;0x002E/*_WM_VKEYTOITEM*/,"LBS_WANTKEYBOARDINPUT风格的列表框会发出本消息给其所有者,以便响应WM_KEYDOWN消息"
;按键弹起
GUIRegisterMsg($WM_KEYUP, "WM_KEYUP") ;0x0101/*_WM_KEYUP*/,"当一个非系统按键被释放弹起时(<ALT>键没有被按下),会发送本消息给拥有键盘焦点的窗口"
;返回被按下的按键的字符码
GUIRegisterMsg($WM_CHAR, "WM_CHAR") ;0x0102/*_WM_CHAR*/,"按下某按键,并已发出WM_KEYDOWN、WM_KEYUP消息,本消息包含被按下的按键的字符码"
;送本消息给一个编辑框或组合框
GUIRegisterMsg($WM_COPY, "WM_CHAR") ;0x0301/*_WM_COPY*/,"应用程序发送本消息给一个编辑框或组合框,以便用CF_TEXT格式复制当前选择的文本到剪贴板"
While 1
Sleep(10)
WEnd
Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam) ;$WM_COMMAND:0x0111,当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗口
Switch $iwParam
Case $idOpen
   _CopyItems()
EndSwitch
EndFunc   ;==>WM_COMMAND
Func WM_CONTEXTMENU($hWnd, $iMsg, $iwParam, $ilParam) ;$WM_CONTEXTMENU:0x007B,当用户某个窗口中点击了一下右键就发送此消息给这个窗口
Switch $iwParam
Case $hListview ;必须是句柄才行,不能是是控件的ID
   If _GUICtrlListView_GetSelectedIndices($hListview) <> "" Then
    Local $hMenu = _GUICtrlMenu_CreatePopup() ;创建下拉菜单, 子菜单或快捷菜单.
    _GUICtrlMenu_InsertMenuItem($hMenu, 0, "复制", $idOpen) ;插入一个新菜单项到指定位置.(使用参数)
    _GUICtrlMenu_TrackPopupMenu($hMenu, $hWnd) ;在指定位置显示一个快捷菜单
    _GUICtrlMenu_DestroyMenu($hMenu) ;销毁指定菜单, 并释放菜单占用的内存
    Return True
   EndIf
EndSwitch
EndFunc   ;==>WM_CONTEXTMENU
Func _CopyItems()
Local $iCols = _GUICtrlListView_GetColumnCount($idListview) ;检索列表视图列数
If (_GUICtrlListView_GetSelectedCount($idListview)) Then ;确定列表视图选中项目数
$a_Indices = _GUICtrlListView_GetSelectedIndices($idListview, 1) ;检索选定项目的索引,返回数组。
Local $gText
For $i = 1 To $a_Indices; 把被选中的项目列出来
   $gText &= _GUICtrlListView_GetItemText($idListview, $a_Indices[$i], 0) & ":" & _GUICtrlListView_GetItemText($idListview, $a_Indices[$i], 1) & @CRLF;被选中项目的第一行,第一列
   ClipPut($gText)
Next
EndIf
EndFunc   ;==>_CopyItems
Func WM_VKEYTOITEM($hWnd, $Msg, $wParam, $lParam);0x002E/*_WM_VKEYTOITEM*/,"LBS_WANTKEYBOARDINPUT风格的列表框会发出本消息给其所有者,以便响应WM_KEYDOWN消息"
    Switch $wParam
Case $VK_CONTROL;Ctrl键
   $isCtrldown = True
Case 67;C键
   $iscdown = True
EndSwitch
Return 'GUI_RUNDEFMSG'
EndFunc   ;==>WM_COMMAND
;按键弹起
Func WM_KEYUP($hWnd, $Msg, $wParam, $lParam);0x0101/*_WM_KEYUP*/,"当一个非系统按键被释放弹起时(<ALT>键没有被按下),会发送本消息给拥有键盘焦点的窗口"
    Switch $wParam
Case $VK_CONTROL;Ctrl键
   $isCtrldown = False
Case 67;C键
   $iscdown = False
EndSwitch
Return 'GUI_RUNDEFMSG'
EndFunc   ;==>WM_COMMAND
;返回被按下的按键的字符码
Func WM_CHAR($hWnd, $Msg, $wParam, $lParam);0x0102/*_WM_CHAR*/,"按下某按键,并已发出WM_KEYDOWN、WM_KEYUP消息,本消息包含被按下的按键的字符码"
    Switch $wParam
Case 0x03
   if ($isCtrldown And $isCdown) Then
    _WinAPI_PostMessage($idGui, $WM_COPY, 121, 0);
            EndIf
EndSwitch
Return 'GUI_RUNDEFMSG'
EndFunc   ;==>WM_COMMAND
;发送本消息给一个编辑框或组合框
Func WM_COPY($hWnd, $Msg, $wParam, $lParam);0x0301/*_WM_COPY*/,"应用程序发送本消息给一个编辑框或组合框,以便用CF_TEXT格式复制当前选择的文本到剪贴板"
    Switch $wParam
Case 0x03;这里要改
   _CopyItems()
EndSwitch
Return 'GUI_RUNDEFMSG'
EndFunc   ;==>WM_COMMAND
Func _Exit()
Exit
EndFunc


chzj589 发表于 2022-4-6 17:42:15


#NoTrayIcon
#RequireAdmin
#PRE_UseX64 = n
#include <GuiListView.au3>
#include <WindowsConstants.au3>
#include <GuiMenu.au3>
#include <WinAPIvkeysConstants.au3>
#include <WinAPISys.au3>
HotKeySet("+a", "_CopyItems") ; Shifta
;HotKeySet("c", "_CopyItems")

chzj589 发表于 2022-4-7 14:34:05

chzj589 发表于 2022-4-6 17:42


不用按Shift+鼠标,点击选择条目就能多选

用_GUICtrlListView_SetItemSelected($ListView1, 0)

smooth 发表于 2022-4-13 06:53:35

chzj589 发表于 2022-4-7 14:34
不用按Shift+鼠标,点击选择条目就能多选

用_GUICtrlListView_SetItemSelected($ListView1, 0)

Ctrl+A和Ctrl+C已搞定,之前走入了误区,一直想获取Ctrl+A和Ctrl+C发出的Windows消息。
页: [1]
查看完整版本: 【已解决】Listview列表视图如何接受Ctrl+C和Ctrl+A?