AutoHotKey для перехода между дисками как в Dos Navigator

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Ответить
ZEV1416
Сообщения: 2
Зарегистрирован: Пн май 08, 2006 17:40

AutoHotKey для перехода между дисками как в Dos Navigator

Сообщение ZEV1416 »

Давно лелеял идею сделать поведение ТС аналогично Дос Навигатору. Если кто помнит, при включенной опции "различать клавиши КТРЛ", можно было ходить с диска на диск удержением клавиши КТРЛ (правой для правой панели, левой - для левой панели) и нажатием клавиш "вправо" и "влево" для листания дисков. При отпускании КТРЛ выполнялся переход на выбранный диск. Так вот, я сделал нечто подобное на AutoHotKey. Попробовать можно с помощью сл. скрипта:

DNLCtrlPressed=0
DNRCtrlPressed=0
DNDiskChange=0

LControl::
Send, {LControl Down}
IfWinActive, ahk_class TTOTAL_CMD
DNLCtrlPressed=1
return

RControl::
Send, {RControl Down}
IfWinActive, ahk_class TTOTAL_CMD
DNRCtrlPressed=1
return

$*LControl Up::
IfWinActive, ahk_class TTOTAL_CMD
{
DNLCtrlPressed=0
if DNDiskChange=1
Send, {Enter}
; Send, {LControl Up}
DNDiskChange=0
}
;else
Send, {LControl Up}
Return


$*RControl Up::
IfWinActive, ahk_class TTOTAL_CMD
{
DNRCtrlPressed=0
if DNDiskChange=1
Send, {Enter}
; Send, {RControl Up}
DNDiskChange=0
}
;else
Send, {RControl Up}
Return

^Right::
IfWinActive, ahk_class TTOTAL_CMD
{
if DNRCtrlPressed=1
{
if DNDiskChange=0
{
Send, {Alt Down}{F2}{Alt Up}
Send, {Down}
DNDiskChange=1
}
else
Send, {Down}
}
else
{
if DNLCtrlPressed=1
{
if DNDiskChange=0
{
Send, {Alt Down}{F1}{Alt Up}
Send, {Down}
DNDiskChange=1
}
else
Send, {Down}
}
else
Send, {Right}
}
}
else
Send, {Right}
return

^Left::
IfWinActive, ahk_class TTOTAL_CMD
{
if DNRCtrlPressed=1
{
if DNDiskChange=0
{
Send, {Alt Down}{F2}{Alt Up}
Send, {Up}
DNDiskChange=1
}
else
Send, {Up}
}
else
{
if DNLCtrlPressed=1
{
if DNDiskChange=0
{
Send, {Alt Down}{F1}{Alt Up}
Send, {Up}
DNDiskChange=1
}
else
Send, {Up}
}
else
Send, {Left}
}
}
else
Send, {Left}
return

$Enter::
If WinActive("ahk_class TInpComboDlg")
Send, {F2}
else
Send, {Enter}
return

Да вот незадача: он подключивает, что проявляется в "залипании" клавиш КТРЛ... Помогите плз найти ошибку, ИМХО, скрипт должен пригодиться "старикам", чья память о Дос Навигаторе еще свежа :-)
Belkin
Сообщения: 26
Зарегистрирован: Вт фев 22, 2005 16:48

Сообщение Belkin »

Привет. Мне было проще написать скрипт заново, чем искать источник глюков. Получилось, как мне кажется, проще а может и надежнее.
Сам я не нахожу такую навигацию удобной, поэтому долго тестировать не стал. Но всё же немного погонял. Вроде не глючило. Надеюсь такой вариант решения задачи тебе подойдет. Удачи.

Код: Выделить всё

SendMode Input ; новый режим высылки без задержки и повышенной надежности
#IfWinActive, ahk_class TTOTAL_CMD ; если активно окно ТС (включаем контекстную чувствительность горячих клавиш), то...
^Left::
	SetTimer, Control_Up, 100 ; переходить к указанной подпрограмме через каждые 0.1 секунды
	GetKeyState, state, LControl ; получить положение левого CTRL
	if state = D ; если нажат левый CTRL
		SendMessage, 0x433, 131,,, ahk_class TTOTAL_CMD ; выслать команду Левая: открыть список выбора диска
	Else ; если нажат правый CTRL
		SendMessage, 0x433, 231,,, ahk_class TTOTAL_CMD ; выслать команду Правая: открыть список выбора диска
	Send, {Up} ; перейти к предыдущему диску
	DNDiskChange = 1 ; выставляем указатель, что существует окно выбора дисков
return ; закончить обработку горячей клавиши

^Right::
	SetTimer, Control_Up, 100 ; переходить к указанной подпрограмме через каждые 0.1 секунды
	GetKeyState, state, LControl ; получить положение левого CTRL
	if state = D ; если нажат левый CTRL
		SendMessage, 0x433, 131,,, ahk_class TTOTAL_CMD ; выслать команду Левая: открыть список выбора диска
	Else ; если нажат правый CTRL
		SendMessage, 0x433, 231,,, ahk_class TTOTAL_CMD ; выслать команду Правая: открыть список выбора диска
	Send, {Down} ; перейти к следующему диску
	DNDiskChange = 1 ; выставляем указатель, что существует окно выбора дисков
return ; закончить обработку горячей клавиши

Control_Up: ; таймер проверки отжатия CTRL
GetKeyState, state, Control ; получить положение CTRL
if ( state = "U" and DNDiskChange = 1 ) ; если CTRL отжат И существует окно выбора дисков, то...
{
	SetTimer, Control_Up, off ; выключить таймер
	Send, {Enter} ; выбрать выделенный диск
	DNDiskChange = ; выставляем указатель, что диск уже выбран
}
Return ; конец подпрограммы по таймеру

#IfWinActive ; отключаем контекстную чувствительность горячих клавиш (эту строчку можно убрать, если такую же строку ниже оставить)


; Хотя эти три строчки ниже не относятся к заявленной задаче, я их оставил, т.к. в твоем посте что-то такое (случайно?) затесалось, и чему я предлагаю другое решение.
#IfWinActive, ahk_class TInpComboDlg ; если активно окно  копир-я/перемещ., то...
Enter::	Send, {F2} ; поставить в очередь
#IfWinActive ; отключаем контекстную чувствительность горячих клавиш
Аватара пользователя
funduk
Сообщения: 1515
Зарегистрирован: Вт авг 16, 2005 16:00
Откуда: Санкт-Петербург

Сообщение funduk »

Неужели вам так важно ctrl различать??? Tab нажали и юзаем команды cm_gotonextdrive и cm_gotopreviousdrive. Потом ещё tab, чтобы в нужную панель перейти.
ZEV1416
Сообщения: 2
Зарегистрирован: Пн май 08, 2006 17:40

Сообщение ZEV1416 »

2Belkin: Благодарю. Испытаю. Затесавшийся кусочек - действительно отношения не имеет, забыл я про него :-) Но все равно спасибо и за его упрощение!
2funduk: Сам об этом думал. Можно CTRLы и не различать. Но дело привычки: в DN так было, и это очень удобно. Там, правда, было еще, что можно, находясь на правой панели, менять диск левой, не переходя туда, но мне это не критично :-)
А по части cm_gotonextdrive - все хорошо, но он выполняет переход сразу (или сразу обламывается), поэтому, если у меня C и E - харды, а D - сидюк без диска, то таким методом на с C на E я не попаду - cm_gotonextdrive не сработает.
Ответить