我想实施一个可怜的男人" Windows Fences" (使用stardock软件)使用autohotkey。
就编程而言,它可能无效。我只想在运行ahk代码片段并使用其他代码片段时获取每个桌面图标的位置,我想将它们放回到原来的位置。
我查看了ahk代码的贡献,并没有看到这样的内容。但同样,我的搜索条件可能有点偏差。假设不存在这样的代码,有没有办法在autohotkey中获取每个图标的屏幕位置及其识别信息?这至少可以帮助我开始。我相信会有更多的问题。
答案 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 ),每个项目都按名称标识。在每个名称项下面是所有正在发生的实例的数组。每个数组项都有X
和Y
,其中包含相应的坐标。
请参阅THE_ITEMNAME
,THE_X_COORD
和THE_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
很可能会失败,除了完美的二次/不透明图标。有三种解决方法:
ImageSearch
之前将桌面背景更改为默认颜色。我最喜欢的,因为它很容易实现,你不必担心任何事情。在您找到相应图标的位置后,其余图标非常简单:MouseClickDrag
它从旧位置到目标位置。