Мне нужно создать функцию, которая будет принимать окно и изменять его размер или восстанавливать его первоначальный размер. Я застрял на записи исходного положения и размера окна, поэтому позже смогу восстановить его исходное положение.
Вот что у меня есть:
win_snapToMonitor(winTitle := "a", subCommand := ""){
static history := []
hwnd := winExist(winTitle)
monNo := coord_OnMonitor(hwnd) ;this function simply return a monitor No, such as "1" or "2"
SysGet, mon, Monitor,% monNo
WinGetPos, winX, winY, winW, winH,% winTitle
;if (history has hwnd in it){ ;this block is pseudo code
; restore window
; remove it from the "history" array
; return
;}
;else{
; history.push(hwnd:{x:winX, y:winY, w:winW, h:winH})
;}
if (subCommand = "toLeft")
WinMove,% "ahk_id" hwnd,,% monLeft ;snap to left corner of monitor
else if (subCommand = "toTop") ;snap to top corner of monitor
WinMove,% "ahk_id" hwnd,,,% monTop
else if (subCommand = "toRight")
winMove,% "ahk_id" hwnd,,,% monTop
else if (subCommand = "toBottom")
winMove,% "ahk_id" hwnd,,,% monBottom - winW
else if (subCommand = "Horiz")
winMove,% "ahk_id" hwnd,, monLeft,, monRight ;fill all horizontal
else if (subCommand = "Vert")
WinMove,% "ahk_id" hwnd,,,% monTop,,% (montop - monBottom) * -1 ;fill all vertical
}
Строка history.push(hwnd:{x:winX, y:winY, w:winW, h:winH})
продолжает выдавать ошибку ==> Unexpected "{"
.
Я пытаюсь сохранить словарь (карту?), имя которого является дескриптором окна. Если посмотреть на него отдельно, то он выглядит вот так
hwnd := winExist("code")
WinGetPos, winX, winY, winW, winH,% winTitle
history := []
history.push(hwnd{x:winX, y:winY, w:winW, h:winH})
history.push(%hwnd%:{x:winX, y:winY, w:winW, h:winH}) ;this does not work either
history.push((%hwnd%):{x:winX, y:winY, w:winW, h:winH}) ;this does not work either
history.push((hwnd):{x:winX, y:winY, w:winW, h:winH}) ;this does not work either
msgbox,% json.dump(history) ;print a strinfied json of the AHK object
Я пытаюсь создать такие данные
[
"0x13f11" : {
"x" : 100,
"y" : 100,
"w" : 1000,
"w" : 1000,
}
"0x13f722" : {
"x" : 200,
"y" : 200,
"w" : 2000,
"w" : 2000,
}
...
]
Я решил хранить данные в этой структуре, потому что думаю, что смогу запросить history
и вернуть соответствующий дескриптор в списке имеющихся дескрипторов, выполнение arrayMatch(history, hwnd)
должно вернуть элемент массива
Код для arrayMatch
;Match a value in a array using case-insensitive string matching, with the option to return first or all matches and value or index
arrayMatch(array, match, all := 0, index := 0){
out := []
loop,% array.Length()
{
if (index){
if (array[A_Index] = match){
return A_Index
}
}
else{
if (array[A_Index] == match){
if (all)
out.push((array[A_Index]))
else
return (array[A_Index])
}
}
}
return out
}
Я очень начинающий программист, поэтому любые предложения по улучшению структуры данных будут приветствоваться.
PS: Я знаю, что в Windows есть такая функция, но для меня это программный проект.
Любая помощь будет принята с благодарностью!
Вы выбрали массив, чтобы хранить данные в порядке? Если нет, то нет смысла использовать массив, это только усложняет задачу.
Если использование массива важно, вам следует просто сделать это:
history := []
hwnd := WinExist("A")
WinGetPos, winX, winY, winW, winH
history.push({ hwnd: hwnd
, x: winX
, y: winY
, w: winW
, h: winH })
hwnd := WinExist("ahk_exe chrome.exe")
WinGetPos, winX, winY, winW, winH
history.push({ hwnd: hwnd
, x: winX
, y: winY
, w: winW
, h: winH })
MsgBox, % json.dump(history, , 4)
/* output
[
{
"h": 1550,
"hwnd": "0x907b0",
"w": 2880,
"x": 1456,
"y": 528
},
{
"h": 2108,
"hwnd": "0x911e2",
"w": 2718,
"x": 0,
"y": 0
}
]
*/
И затем здесь вы можете индексировать нужные вам данные или, конечно, даже зацикливаться и искать совпадения.
Или, если на самом деле не важно сохранять данные в порядке, вы можете просто создать dict/map и индексировать с помощью hwnd:
history := {}
hwnd := WinExist("A")
WinGetPos, winX, winY, winW, winH
history[hwnd] := { x: winX
, y: winY
, w: winW
, h: winH }
hwnd := WinExist("ahk_exe chrome.exe")
WinGetPos, winX, winY, winW, winH
history[hwnd] := { x: winX
, y: winY
, w: winW
, h: winH }
MsgBox, % json.dump(history, , 4)
/* output
{
"591792": {
"h": 1550,
"w": 2880,
"x": 1456,
"y": 528
},
"594402": {
"h": 2108,
"w": 2718,
"x": 0,
"y": 0
}
}
*/
MsgBox, % json.dump(history[hwnd], , 4)
/* output
{
"h": 2108,
"w": 2718,
"x": 0,
"y": 0
}
*/
Нет, порядок массива не важен, когда я думал, как я могу определить и записать количество окон, размер которых я изменил/переместил, дескрипторы окон, хранящиеся в массиве, были единственным решением, которое не оправдало ожидания. Поэтому я застрял в лабиринте, пытаясь быстро найти или получить доступ к дескрипторам в массиве
history
. В любом случае, ваше решение о том, как подойти кhistory
, было намного более эффективным. Ты гений, я всегда многому учусь благодаря твоим постам, ура