Isso pode ser feito usando as funções Acessibilidade para localizar o botão (no qual você clicaria) na janela do Explorer e, em seguida, executá-lo programaticamente.
Infelizmente, parece que o link para baixar a biblioteca de acessibilidade ( acc.ahk
) não é mais válido ( link ), então talvez seja necessário encontrar uma cópia em uma das outras páginas do fórum (talvez comece no novo fórum) ou no github em algum lugar e incluir as funções adicionais estendidas abaixo.
Para o código abaixo, descobrir como determinar qual nome de controle e childPath usar como argumentos para as funções de acessibilidade está além do escopo de explicação aqui, mas isso pode ser determinado usando Spy++
e Accessibility Info Viewer
. / p>
Quando executado, esse código tem o mesmo efeito de clicar com o mouse no botão no cabeçalho da coluna de classificação, portanto, se ele for classificado de uma maneira, executá-lo novamente classificará de outra maneira.
Se você quisesse classificar por um dos outros campos, também poderia substituir "Data" no argumento myName por uma das outras colunas para classificar (Nome, Tipo, etc.).
Este código requer acc.ahk
, como mencionado acima, e é testado trabalhando para classificar por data para uma janela do Explorer. Ele também é robusto contra os nomes das colunas que mudam ou se movem porque a chamada para acc_doIfChildName()
itera pela lista de nomes de colunas que estão presentes, até encontrar o argumento myName
que foi transmitido e, em seguida, executa o defaultAction para esse botão. Se não encontrar um botão correspondente, ele retornará apenas False
para o valor de retorno 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
}