Это можно сделать с помощью функций специальных возможностей, чтобы найти кнопку (которую вы щелкнули бы) в окне проводника, а затем выполнить ее программным способом.
К сожалению, похоже, что ссылка для загрузки библиотеки специальных возможностей (acc.ahk
) больше не действительна (https://autohotkey.com/board/topic/77303-acc-library-ahk-l-updated-09272012/), поэтому вам может понадобиться найти копию на одной из других страниц форума (может быть, начать на новом форуме) или где-нибудь на github, а затем включить дополнительные расширенные функции ниже.
Для приведенного ниже кода выяснение того, как определить, какое имя элемента управления и childPath следует использовать в качестве аргументов для функций доступности, выходит за рамки объяснения здесь, но их можно определить с помощью Spy++
и средства Accessibility Info Viewer
о специальных возможностях .
При выполнении этот код имеет тот же эффект, что и нажатие мыши на кнопке в заголовке столбца сортировки, поэтому, если он отсортирован одним способом, его повторное выполнение будет сортировать другим способом.
Если вы хотите отсортировать по одному из других полей, вы также можете заменить "Date" в аргументе myName на один из других столбцов для сортировки (Name, Type и т.д.).
Этот код требует acc.ahk
как отмечалось выше, и проверяется на работоспособность сортировки по дате для окна проводника. Он также устойчив к изменению или перемещению имен столбцов, потому что вызов acc_doIfChildName()
выполняет итерацию по списку присутствующих имен столбцов, пока не найдет переданный аргумент myName
, а затем не выполнит действие по умолчанию для этой кнопки. Если он не находит соответствующую кнопку, он просто вернет False
для возвращаемого значения foundAndExecuted
.
#Persistent
#SingleInstance, Force
#NoEnv
;-----------------------------------------------------------------------------------------------------------------------
; Press F2 to Sort by date in any active Explorer window
;-----------------------------------------------------------------------------------------------------------------------
#IfWinActive ahk_class CabinetWClass ahk_exe Explorer.exe
F2::
Tooltip % "Sorting by date..." ; acc functions can take a second, show user status in progress...
myHwnd:=ControlGet(cmd:="Hwnd", val:="", ctl:="ShellView", "ahk_class CabinetWClass ahk_exe explorer.exe")
retVal:=acc_doIfChildName(myName:="Date", childPath:="4.1.4.1", statusBarObj:="ahk_id" myHwnd, loopBackward:=False)
Tooltip ; clear status Tooltip
Return
#IfWinActive
ExitApp
#Include acc.ahk
;-----------------------------------------------------------------------------------------------------------------------
; acc_doIfChildName() - Iterate all children looking for the correct childname to try and execute...
;-----------------------------------------------------------------------------------------------------------------------
acc_doIfChildName(myName, childPathArg, myWinTitleOrObj, loopBackward:=False, startIndex:=1) {
;-------------------------------------------------------------------------------
; Set for multiple dialogs below during debugging
;-------------------------------------------------------------------------------
debug:=False
Loop, % childCount:=acc_get("childCount", childPathArg, childID:=0, myWinTitleOrObj) {
If acc_doIfName(myName, childPath:=childPathArg "." (loopBackward ? childCount+1-A_Index : A_Index), myWinTitleOrObj) ; Loop backwards to find faster since it will be at the end
Return foundAndExecuted:=True
Else If debug {
ctlName :=acc_get("name", childPath, childID:=0, myWinTitleOrObj)
ctlValue:=acc_get("value", childPath, childID:=0, myWinTitleOrObj)
MsgBox % "A_Index=" A_Index "`n" . "ctlName=" ctlName "`n" . "ctlValue=" ctlValue "`n"
}
}
Return foundAndExecuted:=False
}
;-----------------------------------------------------------------------------------------------------------------------
; acc_doIfName() - doDefaultAction() if searchItemName matches the control name at childPath
;-----------------------------------------------------------------------------------------------------------------------
acc_doIfName(myName, childPath, myWinTitle) {
Return acc_doIf("Name", myName, childPath, myWinTitle)
}
;-----------------------------------------------------------------------------------------------------------------------
; acc_doIf() - doDefaultAction() if field and value match correctly for childPath
;-----------------------------------------------------------------------------------------------------------------------
acc_doIf(accField, searchItem, childPath, myWinTitle) {
foundAndExecuted:=False
Try {
If ((ctlName:=acc_get(accField, ChildPath, childID:=0, myWinTitle))=searchItem) {
oAcc := acc_Get("Object", ChildPath, ChildID, myWinTitle)
oAcc.accDoDefaultAction(ChildID)
foundAndExecuted:=True
}
}
Return foundAndExecuted
}
;-----------------------------------------------------------------------------------------------------------------------
; ControlGet()
;-----------------------------------------------------------------------------------------------------------------------
ControlGet(Cmd, Value:="", Control:="", WinTitle:="", WinText:="", ExcludeTitle:="", ExcludeText:="") {
ControlGet, v, % Cmd, % Value, % Control, % WinTitle, % WinText, % ExcludeTitle, % ExcludeText
Return, v
}