Atalho de teclado para ordenar por data modificada

0

Noob aqui Estou usando a tecla autohot para ordenar por data modificada sempre que estou no explorador de arquivos.

O problema é que, em algumas pastas, se a ordem das colunas for diferente, o meu script não funciona.

Alguém sabe se existe um código único para a data de modificação?

    
por AMSGH 18.04.2018 / 21:34

1 resposta

1

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
}
    
por 20.04.2018 / 07:23