找回密码
 加入
搜索
查看: 940|回复: 3

[网络通信] 【已解决】Listview列表视图如何接受Ctrl+C和Ctrl+A?

[复制链接]
发表于 2022-4-6 17:10:21 | 显示全部楼层 |阅读模式
本帖最后由 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[5][2] = [["状态", "证书有效"], ["序列号", "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[0]  ; 把被选中的项目列出来
   $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
发表于 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")
发表于 2022-4-7 14:34:05 | 显示全部楼层

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

用_GUICtrlListView_SetItemSelected($ListView1, 0)

本帖子中包含更多资源

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

×
 楼主| 发表于 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消息。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-4 13:33 , Processed in 0.071020 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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