Noob здесь я использую AutoHot ключ для сортировки по дате, измененной всякий раз, когда я в проводнике.

Проблема в том, что в некоторых папках, если порядок столбцов отличается, мой скрипт не работает.

Кто-нибудь знает, есть ли уникальный код для даты изменения?

1 ответ1

1

Это можно сделать с помощью функций специальных возможностей, чтобы найти кнопку (которую вы щелкнули бы) в окне проводника, а затем выполнить ее программным способом.

К сожалению, похоже, что ссылка для загрузки библиотеки специальных возможностей (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
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .