注册 登录
编程论坛 VB6论坛

获取桌面图标名称,坐标,并移动。哪位大哥给个思路。

df2884111 发布于 2022-02-07 01:07, 1562 次点击
图标名称是不是很难获取的,坐标跟移动基本能实现。就是不能指定图标,桌面就乱了。图标号不精准。
7 回复
#2
df28841112022-02-07 01:55
留个QQ103167938方便联系。
#3
约定的童话2022-02-08 07:21
指定图标是给坐标指定还是名称指定?
#4
yuma2022-02-08 12:39
有图标名称,就可以指定了。图标名称就是文件名称。
#5
yuma2022-02-08 13:16
右击桌面,自动排列图标要去除勾选。
只有本站会员才能查看附件,请 登录


基于坐标的图标移动:
程序代码:
Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Private Const MOUSEEVENTF_MOVE = &H1 '移动鼠标
Private Const MOUSEEVENTF_LEFTDOWN = &H2 '模拟鼠标左键按下
Private Const MOUSEEVENTF_LEFTUP = &H4 '模拟鼠标左键抬起
Private Const MOUSEEVENTF_ABSOLUTE = &H8000 '标示是否采用绝对坐标
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub Form_Load()
Form1.Visible = False
SetCursorPos 259, 231 '鼠标移动到图标源位置
mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 '左键按下
Sleep 1000 '实测操作必须停顿,停顿时间必须>=24
SetCursorPos 972, 315 '鼠标移动到目标位置
mouse_event MOUSEEVENTF_ABSOLUTE + MOUSEEVENTF_MOVE, 0, 0, 0, 0
Sleep 1000 '实测操作必须停顿,停顿时间必须>=24
mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
End Sub
#6
风吹过b2022-02-08 16:53
图标位置 写在 HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Bags\1\Desktop 这里,
但数据看不懂,百度了一下,看雪有人做了解析,还是用楼上的模拟吧!

-----------------------------
大牛的提示:
从explorer.exe里调ListView_GetItemPosition可以取设置桌面图标位置,调ListView_SetItemPosition可以设置桌面图标位置。

注册表中的数据结构
offset_00: 16个字节0
offset_10: 4 byte pos_x,4byte pos_y,2byte=struct_Icon1_length,n byte struc_Icon
offset_next:4 byte pos_x,4byte pos_y,2byte=struct_Icon2_length,n byte struc_Icon
(offset_next=offset_previous+2byte_struct_Icon_length+8_x_y各4byte)
以下一直类推。
现在的问题是。具体的struct_Icon的结构是怎样的?

#7
df28841112022-02-11 16:58
有图标名称,例:用代码获取桌面:"360浏览器"图标当前坐标值及对应的图标序号,因为有序号我才能控制该图标坐标,获取当前坐标是判断坐标是否位置不对,
               网上找到部分代码测试
    '获得桌面句柄。
    hdesk = FindWindow("progman", vbNullString)
    hdesk = FindWindowEx(hdesk, 0, "shelldll_defview", vbNullString)
    hdesk = FindWindowEx(hdesk, 0, "syslistview32", vbNullString)
    '查找桌面图标数目。
    icount = SendMessageByLong(hdesk, LVM_GETTITEMCOUNT, 0, 0&)
    For i = 0 To icount - 1
        '显示图标。
        Call SendMessageByLong(hdesk, LVM_GETITEMPOSITION, i, pFileMap)
        '返回坐标。
        CopyMemoryTwo Curpos, pFileMap, 8
        IconPosition(i) = Curpos
        IconPosition2(i) = Curpos
        objItem.mask = LVIF_TEXT
        objItem.iSubItem = 0
        objItem.pszText = pFileMap2
        objItem.cchTextMax = 40
         CopyMemoryOne pFileMap, objItem, 40
         lngLength = SendMessageByLong(hdesk, LVM_GETITEMTEXT, i, pFileMap)
         CopyMemoryTwo savebuf, pFileMap2, 40
        '取得图标名称。
        If lngLength > 40 Then lngLength = 40
        strName = Left$(savebuf.x, lngLength)
        IconName(i) = strName
End Sub
经测试获取名称、坐标返回失败,可能我的是WIN10系统,但可控制序号图标坐标。
总结:控制图标可以,难在获取当前桌面图标名称对应的序号及坐标,求控制目标,获取当前桌面图标实时对应数据。
#8
df28841112022-02-11 17:11
指定图标是给坐标指定还是名称指定?

指定当前桌面图标 求序号和坐标
1