1 (изменено: Alectric, 2014-08-25 17:46:50)

Тема: AHK: Переход назад в проводнике двойным кликом мыши

Бьюсь уже очень давно над этой задачей, получается не очень.
Вот боле менее рабочий код:

#SingleInstance,Force
AutoTrim,Off
CoordMode,Mouse,Screen
CoordMode,ToolTip
CoordMode,Pixel
Menu,Tray,UseErrorLevel
process,priority,,abovenormal
SendMode,Input
SetBatchLines,-1
SetControlDelay,0
SetFormat,float,6.0
SetKeyDelay,0
SetTitleMatchMode,2
SetWinDelay,20
SetWorkingDir,%A_ScriptDir%
StringCaseSense,On

DoubleClicksetTime:=DllCall("GetDoubleClickTime")

loop
{
  sleep,50
if DubleClickDone=1
{
;  sleep,100
  if (Classs ~= "(Cabinet|Explore)WClass")
  {
    if SelectedFiles=
    {
      DubleClickDo=1
      send,{bs}
    }
  }
  DubleClickDone=
}
;tooltip,"%DubleClickDone%"`n"%SelectedFiles%"
}

~LButton::
MouseGetPos,oldmx,oldmy,mwin,mctrl
;WinGetTitle,title,ahk_id %mwin%
WinGetClass,classs,ahk_id %mwin%

keywait,LButton,L

If (DubleClickDo="" and DubleClickDone="" and A_TimeSincePriorHotkey<DoubleClicksetTime and A_ThisHotkey=A_PriorHotkey)
  DubleClickDone=1
else
{
  DubleClickDo=
  SelectedFiles:=GetSelectedFiles()
}
return

GetSelectedFiles(hwnd="")
{
   if (hwnd = "")
      WinGet, hwnd,, A
   objShell := ComObjCreate("Shell.Application")
   for window in objShell.Windows
      if (window.hwnd = hwnd && ShellWindow := 1)
         Break
   if !ShellWindow
      return
   for item in window.document.SelectedItems
         ret .= item.path . "`n"
   Return SubStr(ret, 1, -1)
}

(Были варианты без цикла, но тоже плохо работали.)

Но в нем несколько проблем. При быстрых кликах иногда выскакивает ошибка:

+ открыть спойлер

Error: 0x80004001 - He поддерживается
Source:                  (null)
Description:            (null)
HelpFile:                 (null)
HelpContext:          0
Specifically: document

LineS
096  WinGet,hwnd„A
097  objShell := ComObjCreate("Shell. Application")
098  For window, in objShell.Windows
099  if (window, hwnd = hwnd && Shell Window := 1)
100  Break
101  if! Shell Window
102  Return
—> 103  For item, in window.document.Selectedltems
104  ret .= item.path ."

Continue running the script?

Заметил что ошибка эта происходит при закрытии окна проводника в котором работал.

И если перед двойным кликом был выделен какой-нибудь объект, то перехода назад не происходит.
Прошу помощи.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

2

Re: AHK: Переход назад в проводнике двойным кликом мыши

Что-то очень много кода для простой задачи. Вроде всё просто:

  1. отловить двойное нажатие

  2. послать в окно Проводника нажатие Backspace

3 (изменено: Alectric, 2014-08-25 06:20:16)

Re: AHK: Переход назад в проводнике двойным кликом мыши

Кроме "ловли" двойного нажатия нужно еще узнать, не выделен ли какой-нибудь файл, тут и возникает проблема, например при открытии папок.
Наверное нужно было указать это в первом посте, хотя это вроде очевидно.

И что Вы можете сказать об ошибке, как от нее избавиться?

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

4

Re: AHK: Переход назад в проводнике двойным кликом мыши

Всё равно не понятно, в чём проблема. При чём здесь выделенный файл? Он не мешает перейти назад по нажатию Backspace, а в первом сообщении про его роль не сказано.

Предлагаю рассказать пошагово, как это должно работать.

5 (изменено: Alectric, 2014-08-25 12:39:14)

Re: AHK: Переход назад в проводнике двойным кликом мыши

При двойном клике по файлу или папке он(а) должен(а) открыться, как это обычно происходит.
При двойном клике по пустому месту в проводнике - переход назад (в идеале переход на уровень назад, пока что временно использую BS).

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

OFF: Теперь жалею, что не написал об этом с самого начала.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

6

Re: AHK: Переход назад в проводнике двойным кликом мыши

Тогда будет сложнее. AHK: Получить полное имя файла под курсором. Там же ссылка на Get paths of selected items in an explorer window.

7

Re: AHK: Переход назад в проводнике двойным кликом мыши

Спасибо за ссылки, буду думать.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

8 (изменено: serzh82saratov, 2014-08-25 13:01:50)

Re: AHK: Переход назад в проводнике двойным кликом мыши

При двойном клике по пустому месту в проводнике

Двойной клик по список или панель инструментов.


#If (WinActive("ahk_class CabinetWClass ahk_exe explorer.exe"))

~LButton:: 
    If (A_PriorHotkey = A_ThisHotkey && A_TimeSincePriorHotkey < 200 && NeedAcc())
        SendInput {Backspace}
    Return
    
#If

NeedAcc()   { 
    Static h 
    h := !h ? DllCall("LoadLibrary","Str","oleacc","Ptr") : h
    If DllCall("oleacc\AccessibleObjectFromPoint", "Int64", 0*DllCall("GetCursorPos","Int64*",pt)+pt
                        , "Ptr*", pacc, "Ptr", VarSetCapacity(varChild,8+2*A_PtrSize,0)*0+&varChild)=0
                        && (Role := ComObjEnwrap(9,pacc,1).accRole(0))
    Return (Role = 33 || Role = 22)  ;  33  это - Список, 22  это - панель инструментов
}

в идеале переход на уровень назад

Тут надо копать. Есть конечно костыль, вставлять путь в адресную строку.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9 (изменено: Alectric, 2014-08-25 20:46:23)

Re: AHK: Переход назад в проводнике двойным кликом мыши

Спасибо большое, это работает.


Как я понял, эта функция отличает объекты находящиеся под курсором.

...

41 тоже нужно добавить - если папка пустая.


Оптимальный вариант на текущий момент:


DoubleClicksetTime:=DllCall("GetDoubleClickTime")
#If (WinActive("ahk_class CabinetWClass ahk_exe explorer.exe"))
~LButton::
If (DubleClickDone="" and A_ThisHotkey=A_PriorHotkey and A_TimeSincePriorHotkey<DoubleClicksetTime and NeedAcc())
{
  DubleClickDone=1
  sendinput,{alt down}
  sendinput,{up}
  sendinput,{alt up}
}
else
  DubleClickDone=
return

#If

NeedAcc() {
    Static h
    h := !h ? DllCall("LoadLibrary","Str","oleacc","Ptr") : h
    If DllCall("oleacc\AccessibleObjectFromPoint", "Int64", 0*DllCall("GetCursorPos","Int64*",pt)+pt
                        , "Ptr*", pacc, "Ptr", VarSetCapacity(varChild,8+2*A_PtrSize,0)*0+&varChild)=0
                        && (Role := ComObjEnwrap(9,pacc,1).accRole(0))
;    Return Role 
    Return (Role = 33 || Role = 22 || Role = 41 || Role = 20)  ;  33  это - Список, 22  это - панель инструментов
}
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

10 (изменено: Alectric, 2014-08-25 17:47:37)

Re: AHK: Переход назад в проводнике двойным кликом мыши

Нашел решение - переход на уровень назад осуществляется с зажатой клавишей "Win".

...

Поторопился... показалось...

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

11

Re: AHK: Переход назад в проводнике двойным кликом мыши

alt+Up

12 (изменено: Alectric, 2014-08-25 20:46:02)

Re: AHK: Переход назад в проводнике двойным кликом мыши

Спасибо большое.

...

В функцию еще нужно 20 добавить - используется в "Библиотеке".

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

13 (изменено: Alectric, 2014-10-26 10:24:21)

Re: AHK: Переход назад в проводнике двойным кликом мыши

Наконец-то сделал. Теперь работает без "глюков".

DoubleClicksetTime:=DllCall("GetDoubleClickTime")
#If (WinActive("ahk_class CabinetWClass ahk_exe explorer.exe"))

~LButton::
MouseGetPos,,,mwin
WinGetTitle,title,ahk_id %mwin%
Needcount++
NeedAcc%Needcount%:=NeedAcc()
if Needcount=2
  Needcount=
If (oldtitledc=title and DubleClickDone="" and A_ThisHotkey=A_PriorHotkey and A_TimeSincePriorHotkey<DoubleClicksetTime and NeedAcc1 and NeedAcc2)
{
  DubleClickDone=1
  sendinput,{alt down}
  sendinput,{up}
  sendinput,{alt up}
}
else
  DubleClickDone:=
oldtitledc:=title
keywait,LButton,L
return

#If

NeedAcc() {
    Static h
    h := !h ? DllCall("LoadLibrary","Str","oleacc","Ptr") : h
    If DllCall("oleacc\AccessibleObjectFromPoint", "Int64", 0*DllCall("GetCursorPos","Int64*",pt)+pt
                        , "Ptr*", pacc, "Ptr", VarSetCapacity(varChild,8+2*A_PtrSize,0)*0+&varChild)=0
                        && (Role := ComObjEnwrap(9,pacc,1).accRole(0))
    Return (Role = 33 || Role = 22 || Role = 41 || Role = 20)  ;  33  это - Список, 22  это - панель инструментов
}

Глюки конечно все равно есть, но незначительные, появляются только при просмотре файловой системы андроида.
И если нажать "Да", то скрипт все равно работает.
Появляется данный "глюк" редко.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

14

Re: AHK: Переход назад в проводнике двойным кликом мыши

Появляется данный "глюк" редко.

Чтоб не появлялось, прописать в начале скрипта:

ComObjError(false)
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

15 (изменено: Alectric, 2014-10-26 11:38:00)

Re: AHK: Переход назад в проводнике двойным кликом мыши

Спасибо. По тестирую.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

16

Re: AHK: Переход назад в проводнике двойным кликом мыши

А какой смысл в проверке If oldtitledc=title? И зачем NeedAcc() на каждый клик, ведь нужно только на второй?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

17

Re: AHK: Переход назад в проводнике двойным кликом мыши

А я себе давно уже такой сделал:

GroupAdd, 1_Group, ahk_class CabinetWClass
GroupAdd, 1_Group, ahk_class ExploreWClass

#IfWinActive, ahk_group 1_Group
~LButton & RButton::
  Send, {Browser_Forward}
RETURN

RButton & LButton::
  Send, {Browser_Back}
RETURN

$RButton:: Send, {RButton}
Return
#IfWinActive

По-моему так удобнее: в Проводнике для перехода назад удерживается правая мышь и нажимается левая, а для перехода вперед — наоборот.

18 (изменено: Alectric, 2014-10-26 21:50:07)

Re: AHK: Переход назад в проводнике двойным кликом мыши

У меня переход на "уровень назад", а не просто назад. Привык к этой функции в XYplorer.
Кроме того, стараюсь использовать меньше горячих клавиш, чтобы избежать многочисленных конфликтов., которые меня просто раздражают.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

19 (изменено: DD, 2014-10-26 22:08:00)

Re: AHK: Переход назад в проводнике двойным кликом мыши

На счёт конфликтов, есть такое. Например, лаунчер Сержа из соседней темы с приведенным на пару не работает. Хотя и свои плюсы есть.

20

Re: AHK: Переход назад в проводнике двойным кликом мыши

Ну тут простая логика, нельзя на две кнопки повесить овер9000 действий, ну или анекдот про рыбку съесть...

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

21

Re: AHK: Переход назад в проводнике двойным кликом мыши

Но если очень надо совместить, то значит и в этом скрипте надо проверять координаты мыши. Если в углу, значит не про нашу честь.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

22

Re: AHK: Переход назад в проводнике двойным кликом мыши

Вот и я о том же: надо что-то одно выбирать (то бишь, морепродукты)))