Autohotkey:我如何获得win 7桌面图标的位置

时间:2014-05-08 17:51:58

标签: autohotkey

我想实施一个可怜的男人" Windows Fences" (使用stardock软件)使用autohotkey。

就编程而言,它可能无效。我只想在运行ahk代码片段并使用其他代码片段时获取每个桌面图标的位置,我想将它们放回到原来的位置。

我查看了ahk代码的贡献,并没有看到这样的内容。但同样,我的搜索条件可能有点偏差。假设不存在这样的代码,有没有办法在autohotkey中获取每个图标的屏幕位置及其识别信息?这至少可以帮助我开始。我相信会有更多的问题。

2 个答案:

答案 0 :(得分:2)

实施例

使用下面发布的功能尝试以下内容:

icons := getDeskIconsPos()
chromePos := icons["Google Chrome"]
for k, pos in chromePos
{
        msgbox % "Google Chrome.lnk is at X: " pos.x " Y: " pos.y
}

描述

该函数返回一个对象(感谢 MCL ),每个项目都按名称标识。在每个名称项下面是所有正在发生的实例的数组。每个数组项都有XY,其中包含相应的坐标。

请参阅THE_ITEMNAMETHE_X_COORDTHE_Y_COORD的代码。 我使用这些名称来澄清信息的存储位置。

功能

getDeskIconsPos() {
    Critical
    static MEM_COMMIT := 0x1000, PAGE_READWRITE := 0x04, MEM_RELEASE := 0x8000
    static LVM_GETITEMPOSITION := 0x00001010, LVM_SETITEMPOSITION := 0x0000100F, WM_SETREDRAW := 0x000B

    ControlGet, hwWindow, HWND,, SysListView321, ahk_class Progman
    if !hwWindow ; #D mode
        ControlGet, hwWindow, HWND,, SysListView321, A
    IfWinExist ahk_id %hwWindow% ; last-found window set
        WinGet, iProcessID, PID
    hProcess := DllCall("OpenProcess"   , "UInt",   0x438           ; PROCESS-OPERATION|READ|WRITE|QUERY_INFORMATION
                                        , "Int",    FALSE           ; inherit = false
                                        , "ptr",    iProcessID)
    ret := {}
    if hwWindow and hProcess
    {  
        ControlGet, list, list,Col1
        VarSetCapacity(iCoord, 8)
        pItemCoord := DllCall("VirtualAllocEx", "ptr", hProcess, "ptr", 0, "UInt", 8, "UInt", MEM_COMMIT, "UInt", PAGE_READWRITE)
        Loop, Parse, list, `n ;Loop through items in list and get the information from the POINT structures
        {
            SendMessage, %LVM_GETITEMPOSITION%, % A_Index-1, %pItemCoord%
            DllCall("ReadProcessMemory", "ptr", hProcess, "ptr", pItemCoord, "UInt", &iCoord, "UInt", 8, "UIntP", cbReadWritten)

            ;<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>
            THE_ITEMNAME := A_LoopField
            THE_X_COORD := NumGet(iCoord,"Int")
            THE_Y_COORD := Numget(iCoord, 4,"Int")
            ;<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>
                        if(!ret.HasKey(THE_ITEMNAME))
                        {
                                ret[THE_ITEMNAME] := []
                        }
                        ret[THE_ITEMNAME].Insert({x: THE_X_COORD, y: THE_Y_COORD})
        }
        DllCall("VirtualFreeEx", "ptr", hProcess, "ptr", pItemCoord, "ptr", 0, "UInt", MEM_RELEASE)
    }
    DllCall("CloseHandle", "ptr", hProcess)
    return ret
}

附加

如果您只想保存并恢复桌面图标位置,可以在此处尝试DeskIcons()
http://ahkscript.org/boards/viewtopic.php?f=6&t=3529

示例 DeskIcons()的使用情况:

; save positions
coords := DeskIcons()
MsgBox now move the icons around yourself
; load positions
DeskIcons(coords)

答案 1 :(得分:0)

我不认为这是实现这一目标的简单方法。但是如果性能不是问题,ImageSearch应该可以很好地工作(即使它是:对于较少数量的图标,它应该仍然可以执行)。我看到的唯一问题是桌面背景:如果它发生变化,ImageSearch很可能会失败,除了完美的二次/不透明图标。有三种解决方法:

  1. 永远不要更改桌面背景。最简单的方法,但如果您经常使用桌面重做器,则很可能不是一种选择。
  2. 每次更改背景时都会获取图标的新屏幕截图。维护非常高,具体取决于您更换桌面的需要。
  3. 让脚本在运行ImageSearch之前将桌面背景更改为默认颜色。我最喜欢的,因为它很容易实现,你不必担心任何事情。
  4. 在您找到相应图标的位置后,其余图标非常简单:MouseClickDrag它从旧位置到目标位置。

    参考文献: