找回密码
 加入
搜索
查看: 388|回复: 7

[系统综合] 请教获取桌面图标返回-1

[复制链接]
发表于 2023-10-8 11:38:54 | 显示全部楼层 |阅读模式
本帖最后由 vigiles 于 2023-10-8 11:43 编辑



AutoIt v3.3.16.1 中文版, https://www.autoitx.com/thread-73305-1-1.html
windows 7,x64。

======
使用 WinGetHandle 获取桌面句柄,使用 ControlGetHandle 获取控件句柄,
使用 ControlListView 获取图标,FindItem和SelectAll都是返回-1,(SelectAll时桌面图标会被全选,但也返回-1)
请教,如何正确处理
#include <Array.au3>
#include <GUIConstantsEx.au3>
#Include <GuiListView.au3>

Send("#d")   ; Win+D,显示桌面
Local $hDesktop = WinGetHandle("Program Manager")   ; 桌面的句柄
Local $hWidget = ControlGetHandle("Program Manager", "", "SysListView321")   ; 获取控件的内部句柄.

Local $index = ControlListView($hDesktop, "", $hWidget, "FindItem", "WPS文字")   ; 查找目标图标
Local $iconX=_GUICtrlListView_GetItemPositionX($hWidget, $index)
Local $iconY=_GUICtrlListView_GetItemPositionY($hWidget, $index)
ConsoleWrite("索引:" & $index & ",x=" & $iconX & ",y=" & $iconY & @CRLF)   // index   -1
 
Local $iconList = ControlListView($hDesktop, "", $hWidget, "SelectAll")   ; 选中桌面全部图标
;Local $iconList = ControlListView($hDesktop, "", $hWidget, "GetSelected", 1)   ; 选中桌面全部图标
ConsoleWrite("图标s:" & _ArrayToString($iconList) & @CRLF)  ; iconList   -1

发表于 2023-10-13 00:51:11 | 显示全部楼层
你这不是AU3版本问题,是你的这段代码必须编译成64位程序才能正常访问64位系统的桌面图标。
估计是牵扯到内置函数的跨进程访问。
这段古老的代码忘记添加系统版本判断,也没添加注意事项,以至于拿过来执行后出现这种未知错误。

发表于 2023-10-12 11:25:10 | 显示全部楼层
WIN7/WIN10都可以获取桌面图标信息。
#include <GuiListView.au3>
Global $__g__hLVLastWnd
Global $ClassName = "Progman"
Global $hDeskTop,$hShellDll,$hWnd,$iCount,$sName,$xy
$hDeskTop = _WinAPI_FindWindowEx(Null, Null, $ClassName, Null)
While $hDeskTop <> 0
        $hShellDll = _WinAPI_FindWindowEx($hDeskTop, Null, "SHELLDLL_DefView", Null)
        If $hShellDll <> 0 Then ExitLoop
        $hDeskTop = _WinAPI_FindWindowEx(Null, $hDeskTop, $ClassName, Null)
WEnd

$hWnd = _WinAPI_FindWindowEx($hShellDll, Null, "SysListView32", Null)
$iCount = ControlListView($hDeskTop, "", $hWnd, "GetItemCount")

For $iIndex = 0 To $iCount - 1
        $sName = __GUICtrlListView_GetItemText($hWnd, $iIndex)
        $xy = _GUICtrlListView_GetItemPosition($hWnd, $iIndex)
        ConsoleWrite("图标位置 " & $sName & " " & $xy[0] & "," & $xy[1] & @CRLF)
Next

Func __GUICtrlListView_GetItemText($hWnd, $iIndex, $iSubItem = 0)
        Local $bUnicode = _GUICtrlListView_GetUnicodeFormat($hWnd)
        If @OSArch == "X86" Then
                Local Const $tagLVITEM = "struct;uint Mask;int Item;int SubItem;uint State;uint StateMask;ptr Text;int TextMax;int Image;lparam Param;" & _
                                "int Indent;int GroupID;uint Columns;ptr pColumns;ptr piColFmt;int iGroup;endstruct"
        Else
                Local Const $tag_LVITEM = "struct;uint Mask;int Item;int SubItem;uint State;uint StateMask;UINT64 Text;int TextMax;int Image;UINT64 Param;" & _
                                "int Indent;int GroupID;uint Columns;UINT64 pColumns;UINT64 piColFmt;int iGroup;endstruct"
        EndIf

        Local $tBuffer
        If $bUnicode Then
                $tBuffer = DllStructCreate("wchar Text[4096]")
        Else
                $tBuffer = DllStructCreate("char Text[4096]")
        EndIf
        Local $pBuffer = DllStructGetPtr($tBuffer)
        Local $tItem = DllStructCreate($tag_LVITEM)
        DllStructSetData($tItem, "SubItem", $iSubItem)
        DllStructSetData($tItem, "TextMax", 4096)
        If IsHWnd($hWnd) Then
                If _WinAPI_InProcess($hWnd, $__g__hLVLastWnd) Then
                        DllStructSetData($tItem, "Text", $pBuffer)
                        _SendMessage($hWnd, $LVM_GETITEMTEXTW, $iIndex, $tItem, 0, "wparam", "struct*")
                Else
                        Local $iItem = DllStructGetSize($tItem)
                        Local $tMemMap
                        Local $pMemory = _MemInit($hWnd, $iItem + 4096, $tMemMap)
                        Local $pText = $pMemory + $iItem
                        DllStructSetData($tItem, "Text", $pText)
                        _MemWrite($tMemMap, $tItem, $pMemory, $iItem)
                        If $bUnicode Then
                                _SendMessage($hWnd, $LVM_GETITEMTEXTW, $iIndex, $pMemory, 0, "wparam", "ptr")
                        Else
                                _SendMessage($hWnd, $LVM_GETITEMTEXTA, $iIndex, $pMemory, 0, "wparam", "ptr")
                        EndIf
                        _MemRead($tMemMap, $pText, $tBuffer, 4096)
                        _MemFree($tMemMap)
                EndIf
        Else
                Local $pItem = DllStructGetPtr($tItem)
                DllStructSetData($tItem, "Text", $pBuffer)
                If $bUnicode Then
                        GUICtrlSendMsg($hWnd, $LVM_GETITEMTEXTW, $iIndex, $pItem)
                Else
                        GUICtrlSendMsg($hWnd, $LVM_GETITEMTEXTA, $iIndex, $pItem)
                EndIf
        EndIf
        Return DllStructGetData($tBuffer, "Text")
EndFunc   ;==>__GUICtrlListView_GetItemText

Func _WinAPI_FindWindowEx($hWndParent, $hWndChildAfter, $sClassName, $sWindowName)
        Local $aResult = DllCall("user32.dll", "hwnd", "FindWindowExW", "hwnd", $hWndParent, "hwnd", $hWndChildAfter, "wstr", $sClassName, "wstr", $sWindowName)
        If @error Then Return SetError(@error, @extended, _WinAPI_GetLastError())
        Return $aResult[0]
EndFunc   ;==>_WinAPI_FindWindowEx
发表于 2023-10-8 14:41:11 | 显示全部楼层
win10测试了一下,FindItem正常返回(查找的字符串)索引号
SelectAll 是没有返回值的,最后两行修改下:
Local $iconList = ControlListView($hDesktop, "", $hWidget, "GetSelected", 1)   ; 选中桌面全部图标
ConsoleWrite("图标s:" & $iconList & @CRLF)
 楼主| 发表于 2023-10-8 21:15:01 | 显示全部楼层
afan 发表于 2023-10-8 14:41
win10测试了一下,FindItem正常返回(查找的字符串)索引号
SelectAll 是没有返回值的,最后两行修改下:
...

谢谢!看来win7只能改需求
 楼主| 发表于 2023-10-12 12:02:28 | 显示全部楼层
gyp2000 发表于 2023-10-12 11:25
WIN7/WIN10都可以获取桌面图标信息。

谢谢!的确可以。太高深了,都看不太懂
发表于 2023-10-12 22:37:02 | 显示全部楼层
vigiles 发表于 2023-10-8 21:15
谢谢!看来win7只能改需求

这种老脚本,一般没理由win10可以win7反而不行。在win7也测试了一下,果然结果同我在2#所示。
所以,是你的au3版本的问题。我用的 3.3.14.2 正常。
 楼主| 发表于 2023-10-12 22:51:03 | 显示全部楼层
afan 发表于 2023-10-12 22:37
这种老脚本,一般没理由win10可以win7反而不行。在win7也测试了一下,果然结果同我在2#所示。
所以,是 ...

谢谢!看来是 .16 版本的问题
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-2 19:53 , Processed in 0.087003 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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