Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

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

 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
ZEV1416



Joined: 08 May 2006
Posts: 2

Post (Separately) Posted: Mon May 08, 2006 17:47    Post subject: AutoHotKey для перехода между дисками как в Dos Navigator Reply with quote

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

Да вот незадача: он подключивает, что проявляется в "залипании" клавиш КТРЛ... Помогите плз найти ошибку, ИМХО, скрипт должен пригодиться "старикам", чья память о Дос Навигаторе еще свежа Smile
Back to top
View user's profile Send private message
Belkin



Joined: 22 Feb 2005
Posts: 26

Post (Separately) Posted: Mon May 15, 2006 00:51    Post subject: Reply with quote

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

Code:

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 ; отключаем контекстную чувствительность горячих клавиш
Back to top
View user's profile Send private message
funduk



Joined: 16 Aug 2005
Posts: 1513
Location: Санкт-Петербург

Post (Separately) Posted: Mon May 15, 2006 01:12    Post subject: Reply with quote

Неужели вам так важно ctrl различать??? Tab нажали и юзаем команды cm_gotonextdrive и cm_gotopreviousdrive. Потом ещё tab, чтобы в нужную панель перейти.
Back to top
View user's profile Send private message
ZEV1416



Joined: 08 May 2006
Posts: 2

Post (Separately) Posted: Mon May 15, 2006 07:54    Post subject: Reply with quote

2Belkin: Благодарю. Испытаю. Затесавшийся кусочек - действительно отношения не имеет, забыл я про него Smile Но все равно спасибо и за его упрощение!
2funduk: Сам об этом думал. Можно CTRLы и не различать. Но дело привычки: в DN так было, и это очень удобно. Там, правда, было еще, что можно, находясь на правой панели, менять диск левой, не переходя туда, но мне это не критично Smile
А по части cm_gotonextdrive - все хорошо, но он выполняет переход сразу (или сразу обламывается), поэтому, если у меня C и E - харды, а D - сидюк без диска, то таким методом на с C на E я не попаду - cm_gotonextdrive не сработает.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group