请教获取桌面图标返回-1
本帖最后由 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
你这不是AU3版本问题,是你的这段代码必须编译成64位程序才能正常访问64位系统的桌面图标。
估计是牵扯到内置函数的跨进程访问。
这段古老的代码忘记添加系统版本判断,也没添加注意事项,以至于拿过来执行后出现这种未知错误。
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 & "," & $xy & @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")
Else
$tBuffer = DllStructCreate("char Text")
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
EndFunc ;==>_WinAPI_FindWindowEx
win10测试了一下,FindItem正常返回(查找的字符串)索引号
SelectAll 是没有返回值的,最后两行修改下:
Local $iconList = ControlListView($hDesktop, "", $hWidget, "GetSelected", 1) ; 选中桌面全部图标
ConsoleWrite("图标s:" & $iconList & @CRLF) afan 发表于 2023-10-8 14:41
win10测试了一下,FindItem正常返回(查找的字符串)索引号
SelectAll 是没有返回值的,最后两行修改下:
...
谢谢!看来win7只能改需求 gyp2000 发表于 2023-10-12 11:25
WIN7/WIN10都可以获取桌面图标信息。
谢谢!的确可以。太高深了,都看不太懂 vigiles 发表于 2023-10-8 21:15
谢谢!看来win7只能改需求
这种老脚本,一般没理由win10可以win7反而不行。在win7也测试了一下,果然结果同我在2#所示。
所以,是你的au3版本的问题。我用的 3.3.14.2 正常。 afan 发表于 2023-10-12 22:37
这种老脚本,一般没理由win10可以win7反而不行。在win7也测试了一下,果然结果同我在2#所示。
所以,是 ...
谢谢!看来是 .16 版本的问题
页:
[1]