;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; конфигурационный файл caesar (c) Андрей Салмов


#
# Общие настройки
#

; Пусть индикатор Scroll Lock отображает не состояние клавиши
; Scroll Lock, а состояние раскладки клавиатуры - светится,
; когда установлена русская раскладка, и нет - иначе.
OnScrollLockForLayout      0x0419

; Установим настройки для вывода OSD-текста.
; Все размеры в osd*-параметрах в данном файле оптимальны для
; разрешения 1024x768.
;   Установим по умолчанию вывод всех OSD-сообщений в правой
;   нижней части экрана.
osdRectPos                 520,400
;   Размер блока для сообщений - примерно 1/4 экрана.
osdRectSize                500,340
;   Размер шрифта - 18 пунктов.
osdFontSize                18
;   Выравнивание текста по правому нижнему краю и не обрезать
;   текст, если он не уместится в выделенной области.
osdTextFlags               0x010A


#
# Действия при старте caesar
#

; Включим цифровую клавиатуру при старте caesar.
OnStartCaesar {
  SetNumLock               on
}


#
# Запуск программ по горячим клавишам
#

; Предполагается, что стандартные комбинации клавиш Windows
; (такие как Win+E, Win+F и т.п.) отключены (это можно сделать
; запустив файл tips/disable-standard-windows-hotkeys.reg и 
; выполнив повторный вход в систему).

; Запускаем Writer из Open Office.
hotkey start-openoffice-writer {
  Key                      Win+W
  Task {
    RunApp                 "C:\Program Files\OpenOffice\program\swriter.exe"
  }
}

; Пишем новое электронное письмо.
hotkey create-new-mail {
  Key                      Win+M
  Task {
    RunApp                 "C:\Program Files\Thunderbird\Thunderbird.exe" -compose
  }
}

; Запускаем Far manager.
hotkey start-far {
  Key                      Win+F
  Task {
    RunApp                 "C:\Program Files\Far\Far.exe"
    ; Вид, размеры и положение окна можно настроить в ветке
    ; реестра
    ; HKEY_CURRENT_USER\Console\C:_Program Files_Far_Far.exe
    ; (они также сохранятся в этой ветке, если выбрать пункт
    ; "Свойства" системного меню приложения, а затем при их
    ; сохранении указать "Сохранить свойства для других окон с
    ; тем же именем").
  }
}

; Другой пример запуска консольного приложения.
; Запускаем консольного клиента MySQL.
hotkey start-mysql-client {
  Key                      Win+S
  Task {
    ; Скрываем первое окно (cmd.exe), которое запускает 
    ; bat-файл и закрывается (что бы не мигало на экране).
    ; Вызов через start (а не просто имя bat-файла) нужен, что
    ; бы указать, что заголовок окна равен "mysql" (для окна с
    ; таким заголовком в реестре я определил специальные
    ; настройки).
    AppShow                hide
    RunApp                 cmd.exe /D /C start "mysql" "C:\mysql\bin\mysql.bat"
    ; Вид, размеры и положение окна можно настроить в ветке
    ; реестра HKEY_CURRENT_USER\Console\mysql.
  }
}

; Подключаемся к серверу с помощью SSH-клиента и выводим
; OSD-сообщение об этом.
hotkey putty-to-srv {
  Key                      Win+P
  Task {
    ; Область OSD-сообщиния - весь экран.
    osdRectPos             1,1
    osdRectSize            1023,767
    ; Выравнивание и по горизонтали и по вертикали - по центру.
    osdTextFlags           0x0105
    ; Размер шрифта - 24 пункта.
    osdFontSize            24
    ; Время отображения сообщения - 2,5 секунды.
    osdTime                2500
    ; Начинаем отображение сообщения.
    osdText                Подключение\nк\nимя-моего-сервера...
    ; Запускаем SSH-клиент.
    RunAppAndWaitForInputIdle "C:\Program Files\PuTTY\putty.exe" @srv
    ; Переключаемся на окно, запущенного приложения, ...
    SwitchToForegroundWindow
    ; ... что бы переместить его в нужное нам место.
    SetWindowPos           80,60
  }
}

; Я отключил стандартные клавиши Windows, но эта мне нужна
; поэтому я определил ее снова.
hotkey start-explorer {
  Key                      Win+E
  Task {
    RunApp                 explorer.exe
  }
}

; Установка модемного соединения.
hotkey dialup-connect {
  Key                      Win+D
  Task {
    ; Запишем в лог-файл, что мы начали соединяться.
    LogStart               on
    AppShow                hide
    RunApp                 cmd.exe /D /C start "dialup" "C:\Program Files\caesar\tips\dialup.bat"
    ; файл dialup.bat:
    ;    @color 0A
    ;    @rasdial MyDialName MyLogin MyPassword
    ;    @if ERRORLEVEL 1 pause
    ;    @exit
  }
}

; Разрыв модемного соединения.
hotkey dialup-disconnect {
  Key                      Ctrl+D
  Task {
    ; Запишем в лог-файл, что мы разорвали соединение.
    LogStart               on
    AppShow                hide
    RunApp                 cmd.exe /D /C rasdial /disconnect
  }
}

; Продемонстрируем возможность запуска по горячей клавише
; только одного экземпляра приложения.
; Пусть по нажатию на Win+1 мы хотим переключаться на открытое
; консольное окно с заголовком "console 1", если оно имеется,
; и запускать данное приложение в противном случае (т.е. если
; оно закрыто).
; Опишем окно нашего приложения.
window console-number-one {
  Title                    console 1
}
;
; Описание горячей клавиши.
hotkey goto-console-number-one {
  Key                      Win+1
  Task {
    ; Предположим, что наше приложение открыто. Попробуем
    ; переключиться на него.
    SwitchToWindow         console-number-one
    if errorlevel = 0
      ; Если нам это удалось (приложение на самом деле было
      ; открыто), то переведем его на передний план.
      SetWindowToForeground
    else
      ; Если переключиться на окно приложения не удалось, то
      ; это говорит о том, что оно закрыто. Запустим его.
      AppShow              hide
      RunApp               cmd.exe /D /C start "console 1" cmd.exe
    endif
  }
}


#
# Использование quick keys
#

; Опишем задачу, которая будет выполнять переключение раскладки
; клавиатуры и сопровождать данное действие визуальным и 
; звуковым оповещением. Назначим данную задачу на нажатие
; любой клавиши Ctrl.
;
; Сначала опишем окно-исключение - окно, в котором раскладку
; по нажатию на Ctrl переключать не нужно. В данном примере -
; это окно Citrix (удаленный рабочий стол). На удаленном
; рабочем столе тоже запущен caesar и я хочу, что бы по Ctrl
; раскладка переключалась именно на удаленном столе,
; осуществлялся скроллинг окон удаленного рабочего стола и т.п.
window citrix {
  ; Отличительным признаком окна пусть будет имя файла
  ; которому оно принадлежит.
  FileName                 C:\PROGRA~1\Citrix\ICACLI~1\WFICA32.EXE
  ; Попутно отключаем режим XMove - при нажатой Alt мы хотим,
  ; что бы двигались окна удаленного рабочего стола, а не само
  ; окно citrix.
  XMove                    off
  ; Аналогично для режима XScroll.
  XScroll                  off
}
;
; Теперь, собственно, задача переключения раскладки.
task switch-layout {
  ; Проверяем: сейчас активно окно Cirtix?
  WindowIs                 citrix
  ; Если - да, то выходим из задачи не выполняя никаких
  ; действий.
  if result = 1
    exit
  endif
  ; Иначе - переключаем раскладку клавиатуры.
  SetKeyboardLayout        to prev layout
  ; Вполне приемлемым вариантом будет и эмуляция нажатия
  ; клавиш, по которым Windows переключает раскладку
  ; клавиатуры.
  # SendKeystroke          Ctrl+Shift
  ; Звуковое сопровождение этого действия (если оно вам
  ; требуется) рекомендую задать проигрыванием стандартного
  ; звука Windows (который вы можете изменить выбрав "Пуск", 
  ; "Панель управления", "Звуки и аудиоустройства").
  PlayStandardSound        default
  ; Другой вариант звукового сопровождения -  воспроизведение
  ; wav-файла.
  # PlaySound              C:\Windows\Media\start.wav
  ; И, наконец, третий вариант - это использование системного
  ; динамика. (Учтите, что выполнение команды Beep, в отличие
  ; от первых двух вариантов, завершится только после того,
  ; как звук будет полностью проигран динамиком.)
  # Beep                   800,80
  ; Также возможно визуальное сопровождение (выводим OSD-текст
  ; с именем раскладки).
  Sleep                    130
  osdText                  %L
}
;
; Назначим данную задачу на нажатие клавиш левый и правый Ctrl.
OnPressLCtrl               switch-layout
OnPressRCtrl               switch-layout

; По левой клавише Shift будем включать английскую раскладку.
OnPressLShift {
  WindowIs                 citrix
  if result = 1
    exit
  endif
  SetKeyboardLayout        00000409
  PlayStandardSound        default
  ; Вывод названия раскладки можно сделать как в задаче
  ; task-switch, а можно и упростить:
  osdText                  Английский (США)
}

; По правой клавише Shift будем включать русскую раскладку.
OnPressRShift {
  WindowIs                 citrix
  if result = 0
    SetKeyboardLayout      00000419
    PlayStandardSound      default
    osdText                Русский
  endif
}


 
#
# XKey
#

; XKey - специальная, выбираемая вами, клавиша которой можно
; назначить две задачи: одну на нажатие клавиши, вторую - на
; отпускание.
; Настоятельно рекомендую прочитать описание XKey в файле
; man/caesar.conf-full, прежде чем использовать ее.
;
; Часто в русском тексте встречаются которкие английские слова
; или аббревиатуры. Например, - "CD-привод". Наверное никто не
; нажимает Caps Lock, что бы набрать первые две буквы - все
; пользуются клавишей Shift для этих целей. Далее, в
; дополнение, предлагается испльзовать клавишу Apps, для
; переключения раскладки клавиатуры при нажатии на данную
; клавишу и возврата к прежней раскладке при ее отпускании.
;
; Назначаем клавишей XKey клавишу Apps (находится рядом с
; клавишей правый Alt на Windows-клавиатурах, и, по умолчанию,
; вызывает контекстное меню).
XKey                       Apps
;
; При нажатии на нее переключаем раскладку клавиатуры назад.
OnDownXKey {
  SetKeyboardLayout        to prev layout
}
;
; При отпускании - возвращаемся к установленной ранее
; раскладке.
OnUpXKey {
  SetKeyboardLayout        to next layout
  ; Проверим, а были ли нажаты какие-нибудь клавиши после того,
  ; как мы нажали на XKey?
  KeyboardWasChanged
  if result = 0
    ; Если - нет (т.е. мы просто нажали и отпустили клавишу
    ; Apps), то стоит инициировать действие, которое
    ; выполняется при нажатии на Apps по умолчанию. Для этого
    ; эмулируем нажатие этой клавиши.
    SendKeystroke          Apps
  endif 
}
;
; Чуть более сложным будет пример, если мы зададимся целью при
; нажатии на клавишу Apps включать английскую раскладку, а при
; отпускании - возвращать предыдущую раскладку клавиатуры
; какой бы она не была. Это будет выглядеть так:
;     OnDownXKey {
;       # Запоминаем текущую раскладку клавиатуры.
;       StoreKeyboardLayout
;       # Устанавливаем английскую раскладку.
;       SetKeyboardLayout        00000409
;     }
;     OnUpXKey {
;       # Устанавливаем, сохраненную ранее раскладку
;       # клавиатуры.
;       SetKeyboardLayout        to stored layout
;       KeyboardWasChanged
;       if result = 0
;         Sendkeystroke          Apps
;       endif
;     }
; Думаю, что данная возможность будет многим полезна. Например,
; программистам 1С: текст программы в конфигураторе пишется
; на русском языке, однако для некоторых символов языка
; (квадратные скобки, знаки "больше", "меньше", вертикальная
; черта и т.п.) приходится переключаться на английскую
; раскладку. Хотя для знаков "больше" и "меньше", возможно,
; более комфортным будет следующее решение (через назначение
; горячих клавиш):
;     hotkey type-less-symbol {
;       Key                      Win+,
;       Task {
;         TypeText               <
;       }
;     }
;     hotkey type-more-symbol {
;       Key                      Win+.
;       Task {
;         TypeText               >
;       }
;     }
;
; Если кого-то не устраивают клавиши Ctrl и Shift как клавиши
; переключения раскладки клавиатуры, и очень хочется
; использовать для этих целей клавишу Caps Lock, то они могут
; реализовать данную возможность как раз через XKey:
;     # В этом случае индикатор Caps Lock можно использовать
;     # как индикатор раскладки клавиатуры.
;     OnCapsLockForLayout        0x0419
;     # Назначаем клавишей XKey клавишу Caps Lock.
;     XKey                       CapsLock
;     # Переключаем раскладку клавиатуры при нажатии на данную
;     # на данную клавишу.
;     OnDownXKey {
;       SetKeyboardLayout        to prev layout
;     }
;     # Можно написать и так:
;     # OnDownXKey               switch-layout
;     # где switch-layout - задача, описанная выше в разделе
;     # "Использование quick keys".


#
# Действия с окнами по горячим клавишам клавиатуры и мыши
#

; Сделаем так, что бы окно закрывалось, если мы нажмем левой
; кнопкой мыши на иконке системного меню в его заголовке.
; Напомню, что по умолчанию это действие в Windows вызывает,
; так называемое, системное (оконное) меню. Мы переопределим
; данное поведение. Windows все стандартные действия 
; в области заголовка окна выполняет вне зависимости от того,
; нажаты ли такие клавиши как Ctrl, Alt, Shift или нет.
; Поэтому, если вам понадобится вернуть стандартное действие
; Windows (в данном случае - вызов оконного меню), то просто
; кликните мышкой по иконке системного меню, удерживая клавишу
; Ctrl (если, конечно же, вы и на Ctrl+LClick on SysMenu не 
; назначили свою задачу).
; Закрытие окна по клику на иконке системного меню оценят те,
; кто часто работает на компьютерах с Mac OS.
hotkey close-window {
  Mouse                    LClick on SysMenu
  Task {
    CloseWindow
  }
}

; По клику правой кнопки мыши в правой половине заголовка окна
; будем вызывать XMenu caesar.
hotkey track-xmenu {
  Mouse                    RClick on CaptionRight
  Task {
    TrackXMenu
  }
}

; А теперь более сложный пример.
; Зададимся целью написать задачу, которая при нажатии на
; кнопку "Свернуть" будет не только свертывать окно (или
; восстанавливать его, если оно свернуто в значок), но и
; выводить OSD-сообщение при выполнении данного действия.
; Кроме того, пусть существует приложение при нажатии на
; кнопку "Свернуть" которого, необходимо сворачивать его в
; трей. Аналогичные действия будут выполняться при нажатии на
; горячую клавишу NumMinus.
;
; Для начала опишем несколько специальных окон.
; Первое - это окно нашего приложения, которое необходимо,
; в отличие от всех остальных, сворачивать в трей.
window thunderbird {
  ; Пусть это будет окно почтового клиента Mozilla Thunderbird.
  ClassName                MozillaUIWindowClass
  FileName                 C:\Program Files\Thunderbird\thunderbird.exe
}
;
; Второе - это окно-исключение.
; (Думаете, что самое "нестандартное" приложение в Windows -
; это Open Office, портированный с Unix-систем? Ошибаетесь.
; Самое настандартное приложение в Windows от компании
; Microsoft - это Office 2007 от компании Microsoft.)
window office-2007-panel {
  ClassName                NetUIHWND
}
;
; Теперь, собственно, горячая клавиша.
hotkey minimize-window {
  ; Горячая клавиша клавиатуры.
  Key                      NumMinus
  ; "Горячая клавиша" мыши.
  Mouse                    LClick on Minimize
  ; Задача
  Task {
    ; Определяем состояние окна.
    WindowStateIsIconic
    if result = 1
      ; Если окно свернуто в значок (это возможно для дочерних
      ; окон приложения), то восстановим его.
      RestoreWindow
      ; И покажем OSD-сообщение по этому поводу.
      osdText              восстановлено\n%t
    else
      ; Иначе (окно не свернуто в значок) определяем, является
      ; ли оно окном программы Mozilla Thunderbird.
      WindowIs             thunderbird
      if result = 1
        ; Если является, то минимизируем его в системный трей.
        MinimizeWindowToTray
        ; И показываем OSD-сообщение об этом.
        osdText            свернуто в трей\n%t
        ; Желаемое действие выполнено, поэтому завершаем
        ; выполнение задачи.
        exit
      endif
      
      ; Если окно не является окном Mozilla Thunderbird, то
      ; проверяем не дочернее ли это окно панели MS Office 2007?
      WindowIs             office-2007-panel
      if result = 1
        ; Если это так, то сделаем текущим родительское окно
        ; данной панели (именно оно и минимизируется самим
        ; MS Office 2007, поэтому и мы поступим также).
        SwitchToParentWindow
      endif
      ; Сворачиваем текущее окно.
      MinimizeWindow
      ; И выводим OSD-сообщение об этом, но не в стандартном
      ; месте (над областью системного трея), а в центре над
      ; панелью задач.
      osdRectPos           99,400
      ; Выравнивание текста сообщения при этом делаем по центру
      ; нижнего края.
      osdTextFlags         0x0109
      ; А саму область сообщения растягиваем почти на всю ширину
      ; панели задач.
      osdRectSize          824,340
      osdText              свернуто\n%t
    endif
  }  
}

; Минимизация окна по клавише Ctrl+NumMinus в системный трей
; и вывод соответствущего OSD-сообщения (над системным треем).
; Аналогичные действие выполняем и при нажатии правой кнопкой
; мыши на кнопке "Свернуть".
hotkey minimize-to-tray {
  Key                      Ctrl+NumMinus
  Mouse                    RClick on Minimize
  Task {
    WindowIs               office-2007-panel
    if result = 1
      SwitchToParentWindow
    endif
    MinimizeWindowToTray
    ; Мышкой мы можем нажать кнопку "Свернуть" у дочернего
    ; окна приложения. А оно в трей свернуто быть не может.
    ; Поэтому OSD-сообщение показываем, только если команда
    ; MinimizeWindowToTray выполнилась успешно.
    if errorlevel = 0
      osdText              свернуто в трей\n%t
    endif
  }
}

; По нажатию правой кнопки мыши на кнопке закрытия окна мы
; будем экстренно (с потерей всех несохраненных данных)
; завершать процесс, которому принадлежит данное окно. Однако,
; делать это будем только после подтверждения полученного от
; пользователя.
hotkey terminate-process {
  Mouse                    RClick on Close
  Task {
    ; Спрашиваем у пользователя нужно ли завершить приложение.
    QuestionBox            Вы уверены?\nЗавершить процесс с потерей всех несохраненных данных?
    if result = 1
      ; И если пользователь ответил "Да", то принудительно
      ; завершаем процесс.
      TerminateApp
    endif  
  }
}

; По нажатию правой кнопки мыши на кнопке приложения в панели
; задач будем закрывать данное приложение (по умолчанию вместо
; этого появляется системное меню главного окна приложения).
;
; Для начала опишем окно самой панели задач. Это понадобится
; нам на тот случай, если правой кнопкой мыши мы нажмем не на
; приложении, а на пустой области панели задач.
window taskbar {
  ClassName                Shell_TrayWnd
}
;
hotkey close-app-in-taskbar {
  ; "Горячая клавиша" на нажатие правой кнопки мыши в области,
  ; в которой расположена панель задач. (Прямоугольник, в
  ; котором располагаются кнопки приложений, у каждого будет
  ; свой, поэтому не ориентируйтесь на приведенные здесь
  ; координаты. Учтите, что область системного трея не должна
  ; входить в этот прямоугольник.)
  Mouse                    RClick in Rect 0,741, 890,765
  Task {
    ; Эмулируем нажатие правой кнопки мыши. Это переведет
    ; приложение на передний план и вызовет его контекстное
    ; меню.
    ClickMouseButton       right
    Sleep                  160
    ; Переключаемся на приложение, которое находится на
    ; переднем плане.
    SwitchToForegroundWindow
    ; Определяем, является ли данное приложение панелью задач.
    WindowIs               taskbar
    if result = 1
      ; Если является, то это значит, что мы кликнули правой
      ; кнопкой мыши на пустом месте панели задач. А по
      ; умолчанию на это действие Windows показывает
      ; контекстное меню панели задач. Меню у нас уже есть, а
      ; значит ничего делать не нужно.
    else
      ; Если мы нажали правой кнопкой мыши на кнопке приложения
      ; в панели задач, то, как и задумали, закроем данное
      ; приложение.
      ; Контекстное меню нам не нужно, поэтому мы из него
      ; выходим.
      Sendkeystroke        Escape
      Sleep                130
      CloseWindow
    endif
  }
}

; При наведении указателя мыши на кнопку "Пуск" будем сразу
; нажимать ее. Иначе зачем же мы наводили? (При различных
; стилях оформления рабочего стола Windows положение и размер
; кнопки "Пуск" разные - не ориентируйтесь на приведенные
; здесь координаты.)
hotkey press-start-button {
  ; Прямоугольную область, в которой находится кнопка "Пуск"
  ; задаем с большим "запасом", т.к. указатель мыши на самом
  ; деле может кратковременно выходить за пределы экрана, а
  ; потом возвращаться Windows "на место".
  Mouse                    move in Rect -500,738, 91,1268
  Task {
    PressStartButton
  }
}

; При переводе указателя в правый нижный угол экрана будем
; отображать рабочий стол (сворачивая все окна), а при повторе
; этого действия будем восстанавливать свернутые окна.
hotkey toggle-desktop {
  Mouse                    move in Rect 1014,759, 5000,5000
  Task {
    ToggleDesktop
  }
}

; При переводе указателя мыши к правой границе экрана будем
; отображать текущий уровень громкости динамиков, а при 
; прокрутке колесика мыши на правой границе экрана будем его
; менять.
;
; Отображение текущего уровня громкости.
hotkey show-volume {
  Mouse                    move in Rect 1023,20, 1523,740
  Task {
    osdRectPos             520,24
    osdTextFlags           0x0102
    ; Ставим большое время отображения OSD-сообщения, говоря
    ; о том, что пока указатель мыши у правой границы мы все
    ; время будем показывать OSD-текст.
    osdTime                600000
    osdText                громкость %v%%
  }
}
;
; Увеличение громкости динамиков.
hotkey up-volume {
  Mouse                    WheelUp in Rect 1023,20, 1523,740
  Task {
    ; Увеличиваем громкость.
    UpVolume               982
    ; И сообщаем о том, что мы наделали.
    osdRectPos             520,24
    osdTextFlags           0x0102
    osdTime                600000
    osdText                громкость %v%%
  }
}
;
; Уменьшение громкости динамиков.
hotkey down-volume {
  Mouse                    WheelDown in Rect 1023,20, 1523,740
  Task {
    DownVolume             982
    osdRectPos             520,24
    osdTextFlags           0x0102
    osdTime                600000
    osdText                громкость %v%%
  }
}
;
; Скрываем OSD-сообщение, когда указатель мыши уходит от правой
; границы экрана.
hotkey hide-volume {
  Mouse                    move out Rect 1023,20, 1523,740
  Task {
    ; Ставим очень маленькое время отображения OSD-сообщения.
    osdTime                200
    ; Позиция вывода сообщения находится далеко за пределами
    ; экрана.
    osdRectPos             5000,5000
    ; Ну и отображаем что-нибудь
    osdText                -
  }
}

; Изменение прозрачности окна, над которым находится указатель
; мыши.
hotkey up-transparency {
  ; Область действия данной "горячей клавиши" - весь экран.
  Mouse                    Shift+WheelUp in Rect 0,0, 1023,767
  Task {
    ; Поскольку прозрачность можно изменять только у окон
    ; верхнего уровня, а указатель мыши может находиться над
    ; дочерним окном, выполним переключение (если оно
    ; требуется) на родительское окно.
    SwitchToParentWindow
    UpTransparencyAlpha    3
    osdRectPos             520,24
    osdTextFlags           0x0102
    osdText                прозрачность %p%%
  }
}
hotkey down-transparency {
  Mouse                    Shift+WheelDown in Rect 0,0, 1023,767
  Task {
    SwitchToParentWindow
    DownTransparencyAlpha  3
    osdRectPos             520,24
    osdTextFlags           0x0102
    osdText                прозрачность %p%%
  }
}

; Изменение размеров текущего окна (окна на переднем плане).
hotkey inc-window-size {
  Mouse                    Ctrl+WheelUp in Rect 0,0, 1023,767
  Task {
    ; Переключаемся с окна над которым находится указатель
    ; мыши на активное окно (окно на переднем плане).
    SwitchToForegroundWindow
    ; Увеличиваем размер окна, сохраняя его пропорции 
    ; (увеличиваем на 24 пикселя меньшую сторону, а большую
    ; так, что бы сохранить пропорции окна).
    ResizeWindow           24,0x8000
    ; Дальнейшие действия имеют смысл, только если изменить
    ; размер окна удалось (размер окна, развернутого на весь
    ; экран, например, изменить не получится).
    if errorlevel = 0
      ; Передвинем окно влево вверх на 12 пикселей. Этот прием
      ; позволит нам добиться того, что центр окна не сместится
      ; после изменения его размеров.
      MoveWindow           -12,0x8000
      ; Выведем получившийся размер окна.
      osdRectPos           520,24
      osdTextFlags         0x0102
      osdText              размер окна %W x %H
    endif
  }
}
hotkey dec-window-size {
  Mouse                    Ctrl+WheelDown in Rect 0,0, 1023,767
  Task {
    SwitchToForegroundWindow
    ResizeWindow           -24,0x8000
    if errorlevel = 0
      MoveWindow           12,0x8000
      osdRectPos           520,24
      osdTextFlags         0x0102
      osdText              размер окна %W x %H
    endif
  }
}


#
# Управление и модификация набираемого текста
#

; Таблица транслитерации из кириллицы.
transliteration from-cp1251 {
  From                     ый ий яя  кс ьи ье ия
  To                       y  y  aya x  ii ie ia

  From                     ЫЙ ИЙ ЯЯ  КС ЬИ ЬЕ ИЯ
  To                       Y  Y  AYA X  II IE IA

  From                     а б в г д е ё ж  з и й к л м н о п р с т у ф х  ц  ч  ш  щ    ь ы ъ э ю  я
  To                       a b v g d e e zh z i i k l m n o p r s t u f kh ts ch sh shch ~ y ~ e yu ya

  From                     А Б В Г Д Е Ё Ж  З И Й К Л М Н О П Р С Т У Ф Х  Ц  Ч  Ш  Щ    Ь Ы Ъ Э Ю  Я
  To                       A B V G D E E Zh Z I I K L M N O P R S T U F Kh Ts Ch Sh Shch ~ Y ~ E Yu Ya
}

; Обратная транслитерация в кириллицу.
; Однозначного соответствия, конечно, нет, но должно быть
; читаемо.
transliteration back-to-cp1251 {
  From                     Shch Ia Zh Kh Ts Ch Sh Yu Ya
  To                       Щ    Ия Ж  Х  Ц  Ч  Ш  Ю  Я

  From                     shch ii ie ia zh kh ts ch sh yu ya x
  To                       щ    ьи ье ия ж  х  ц  ч  ш  ю  я  кс

  From                     SHCH II IE IA ZH KH TS CH SH YU YA X
  To                       Щ    ЬИ ЬЕ ИЯ Ж  Х  Ц  Ч  Ш  Ю  Я  КС

  From                     a b v g d e z i j k l m n o p r s t u f h c ' y
  To                       а б в г д е з и й к л м н о п р с т у ф х ц ь ы

  From                     A B V G D E Z I J K L M N O P R S T U F H C ' Y
  To                       А Б В Г Д Е З И Й К Л М Н О П Р С Т У Ф Х Ц Ь Ы
}

; Транслитерация выделенного текста.
hotkey translit {
  Key                      Win+Right
  Task {
    ; Сохраняем текущее содержимое буфера обмена.
    StoreClipboard
    ; Очищаем буфер обмена на тот случай, если текущее
    ; выделение пусто (ведь желательно что бы в этом случае
    ; буфер обмена также был пуст).
    EmptyClipboard
    ; Копируем выделенный фрагмент в буфер обмена.
    SendKeystroke          Ctrl+C
    Sleep                  160
    ; Выполняем его транслитерацию (используя, описанную выше
    ; таблицу from-cp1251).
    TranslitClipboard      from-cp1251
    ; Вставляем результат из буфера обмена (заменяем выделенный
    ; фрагмент результатом транслитерации).
    SendKeystroke          Ctrl+V
    Sleep                  160
    ; Восстанавливаем, ранее сохраненное содержимое буфера
    ; обмена.
    RestoreClipboard
  }
}

; Обратная транслитерация выделенного текста.
hotkey back-translit {
  Key                      Win+Left
  Task {
    StoreClipboard
    EmptyClipboard
    SendKeystroke          Ctrl+C
    Sleep                  160
    TranslitClipboard      back-to-cp1251
    ; Отображаем результат преобразования в информационном окне.
    InfoBox                %C
    RestoreClipboard
  }
}

; Преобразование выделенного текста к верхнему регистру.
hotkey upper-case {
  Key                      Win+Up
  Task {
    StoreClipboard
    EmptyClipboard
    SendKeystroke          Ctrl+C
    Sleep                  160
    ChangeClipboardCase    to upper case
    SendKeystroke          Ctrl+V
    Sleep                  160
    RestoreClipboard
  }
}

; Преобразование выделенного текста к нижнему регистру.
hotkey lower-case {
  Key                      Win+Down
  Task {
    StoreClipboard
    EmptyClipboard
    SendKeystroke          Ctrl+C
    Sleep                  160
    ChangeClipboardCase    to lower case
    SendKeystroke          Ctrl+V
    Sleep                  160
    EmptyClipboard
    RestoreClipboard
  }
}

; Корректировка и переключение раскладки клавиатуры.
; Пусть мы начали набирать некоторе слово и потом увидели, что
; набираем его не в той раскладке клавиатуры (т.е. у нас
; получилось "ghbdtn", вместо "привет"). Нажмем клавишу Pause,
; что бы исправить неправильное слово и переключиться на
; русскую раскладку клавиатуры.
hotkey change-layout {
  Key                      Pause
  Task {
    ; Любители звукового сопровождения могут озвучить процесс.
    PlayStandardSound      default
    ; Как вариант:
    # PlaySound            C:\Windows\Media\start.wav
    ; Еще вариант: использовать системный динамик.
    ; Однако в этом случае вызов команды Beep обязательно
    ; сделайте самым последним в этой задаче.
    # Beep                 800,80
    ; Сохраняем текущее содержимое буфера обмена.
    StoreClipboard
    ; Очищаем буфер обмена на тот случай, если текущее
    ; выделение пусто (ведь желательно что бы в этом случае
    ; буфер обмена также был пуст).
    EmptyClipboard
    ; Выделяем предыдущее слово и копируем его в буфер обмена.
    ; Как вариант: можно выделять не слово, а фразу до начала
    ; строки. В этом случае Ctrl+Shift+Left нужно заменить на
    ; Shift+Home.
    ; Еще вариант: можно переключать раскладку текущего
    ; выделения, т.е. предполагается, что мы уже выделили
    ; текст, раскладку которого хотим изменить. В этом случае
    ; Ctrl+Shift+Left писать совсем не нужно.
    SendKeystroke          Ctrl+Shift+Left Ctrl+C
    Sleep                  160
    ;
    ; Резюмируя вышеописанные варианты, вместо приведенных
    ; двух строк можно написать, например, следующее:
    # ; Просто копируем в буфер обмена, предполагая, что текст
    # ; уже выделен.
    # SendKeystroke        Ctrl+C
    # Sleep                160
    # ; Проверяем, не пуст ли буфер обмена?
    # ClipboardIsEmpty
    # if result = 1
    #   ; Если пуст, то делаем вывод, что ничего выделено не
    #   ; было, а потому инициируем выделение до начала строки
    #   ; сами.
    #   SendKeystroke      Shift+Home Ctrl+C
    #   Sleep              160
    #   ; Преобразовывать при этом будем не всю строку, а
    #   ; только последнее слово.
    #   UseWordbreakTemplate
    # endif
    ;    
    ; Преобразуем текст в буфере обмена.
    ChangeClipboardLayout  to prev layout
    ; Заменяем выделение на результат преобразования.
    SendKeystroke          Ctrl+V
    Sleep                  160
    ; Переключаем раскладку клавиатуры (что бы продолжить
    ; набор в правильной раскладке).
    SetKeyboardLayout      to prev layout
    ; Восстанавливаем ранее сохраненное содержимое буфера
    ; обмена.
    RestoreClipboard
    ; Информируем пользователя о том, что раскладка клавиатуры
    ; изменилась.
    Sleep                  130
    osdText                %L
  }
}


#
# Прочие горячие клавиши
#

; Копирование текущего выделения в альтернативный (второй)
; буфер обмена, которым будет ячейка 1 caesar (ячейка 0
; используется в этой и других задачах как промежуточная).
hotkey copy-to-my-clipboard {
  Key                      Win+C
  Task {
    ; Сохраняем текущее содержимое буфера обмена в 
    ; промежуточной ячейке.
    StoreClipboard         0
    ; Очищаем буфер обмена на тот случай, если текущее
    ; выделение пусто (ведь желательно что бы в этом случае
    ; буфер обмена также был пуст).
    EmptyClipboard
    ; Копируем выделение в буфер обмена.
    SendKeystroke          Ctrl+C
    Sleep                  160
    ; Теперь сохраняем выделение из буфера обмена в ячейку 1
    ; (она будет нашем вторым буфером обмена).
    StoreClipboard         1
    ; Восстанавливаем первоначальное содержимое буфера обмена
    ; из промежуточной ячейки.
    RestoreClipboard       0
  }
}

; Вставка из альтернативного буфера обмена.
hotkey paste-from-my-clipboard {
  Key                      Win+V
  Task {
    ; Сохраняем текущее содержимое буфера обмена в 
    ; промежуточной ячейке.
    StoreClipboard         0
    ; Копируем в буфер обмена сохраненное ранее содержимое
    ; ячейки 1.
    RestoreClipboard       1
    ; Поскольку RestoreClipboard очищает ячейку 1, то мы ее
    ; снова заполним (что позволит нам осуществлять
    ; многократную вставку из альтернативного буфера).
    StoreClipboard         1
    ; Осуществляем вставку из буфера обмена.
    SendKeystroke          Ctrl+V
    Sleep                  160
    ; Восстанавливаем первоначальное содержимое буфера обмена.
    RestoreClipboard       0
  }
}

; Отображение информации об окне (аналогично выбору пункта
; "Window Info" в XMenu).
hotkey window-info {
  Key                      Win+I
  Task {
    ShowWindowInfo
  }
}

; Блокировка компьюрета.
hotkey lock-computer {
  Key                      Ctrl+`
  Task {
    LockWorkstation
  }
}

; Выключение компьютера.
hotkey shutdown-computer {
  Key                      Win+Escape
  Task {
    osdRectPos             1,1
    osdRectSize            1023,767
    osdTextFlags           0x0105
    osdTextColor           0x0000FF
    osdTextBorderColor     0xEEEEEE
    osdFontSize            36
    osdTime                20000
    osdText                Выключение компьютера...
    Shutdown
  }
}

; Включение режима выделения в консольном окне.
; (Так сделано в Far manager, я же только распростанил эту
; идею на все консольные окна.)
;
; Опишем консольное окно.
window console {
  ClassName                ConsoleWindowClass
}
;
hotkey console-select {
  Key                      Alt+Insert
  Task {
    ; Определяем, в консольном ли окне нажата горячая клавиша.
    WindowIs               console
    ; И выполняем все действия только если это так.
    if result = 1
      ; Имититуем вызов системного меню окна и выбора в нем
      ; пунктов "Изменить", "Пометить".
      ; (Только для русскоязычной Windows.)
      SendKeystroke        Alt+Space
      TypeText             И
      SendKeystroke        Enter
    endif
  }
}

; Выдвижение лотка CD/DVD-привода.
; (Полезно на многих ноутбуках, где кнопка выдвижения лотка
; маленькая, неудобно расположена, туго нажимается и т.п.)
hotkey eject-dvd {
  Key                      Win+J
  Task {
    EjectDevice            D
  }
}


#
# Специальное поведение определенных окон
#

; При запуске калькулятора он становится поверх остальных
; окон, прозрачный и располагается справа внизу экрана.
; В качестве примера задача написана отдельно, а не внутри
; раздела window.
task on-start-calculator {
  SetAlwaysOnTop           on
  SetTransparencyAlpha     209
  SetWindowPos             744,452
  SetProcessPriority       Below Normal
}
;
window calculator {
  ClassName                SciCalc
  Task                     on-start-calculator
}

; В продолжение темы о "нестандартном" приложении MS Office
; (смотрите выше описание к горячей клавиши minimize-window) -
; опишем дочернее окно программы MS Word, в котором мы, из-за
; некорректной работы, открючим режим XMove.
window ms-word-page {
  ClassName                _WwB
  XMove                    off
}

; Размер по умолчанию окон стандартных диалогов сохранения и
; открытия файла очень мал. Увеличим размер данных окон.
task set-opensave-dialog-size {
  SetWindowPos             236,40
  SetWindowSize            565,640
}
window open-dialog-1 {
  ClassName                #32770
  Title                    Открыть
  Task                     set-opensave-dialog-size
}
window open-dialog-2 {
  ClassName                #32770
  Title                    Открытие файла
  Task                     set-opensave-dialog-size
}
window save-dialog-1 {
  ClassName                #32770
  Title                    Сохранить как
  Task                     set-opensave-dialog-size
}
window save-dialog-2 {
  ClassName                #32770
  Title                    Сохранение файла
  Task                     set-opensave-dialog-size
}


#
# Запуск программ по расписанию
#

; Вывод OSD-сообщения, напоминающего текущее время.
job time-remember {
  ; Будем выполнять задачу в начале каждого часа с 6 до 23
  ; часов.
  CronTime                 0 6-23 * * *
  Task {
    osdRectPos             1,1
    osdRectSize            1023,767
    osdTextFlags           0x0105
    osdTextColor           0x0000FF
    osdTextBorderColor     0xEEEEEE
    osdFontSize            36
    osdTime                5000
    osdText                %T{HH':'mm}\n%D{dddd}\n%D{dd MMMM yyyy}
  }
}

; Ротация лог-файла.
job rotate-log {
  ; Будем начинать ведение нового лог-файла каждый месяц
  ; 15-ого числа в 21:30.
  CronTime                 30 21 15 * *
  Task {
    LogStart               on
    CloseLogFile
    AppShow                hide
    RunAppAndWaitForClose  cmd.exe /D /C "C:\Program Files\caesar\tips\rotate-logs.bat" "C:\Program Files\caesar\caesar.log"
    OpenLogFile
    ; Файл rotatelogs.bat:
    ;    if exist "%~dpnx13" del /F /S /Q "%~dpnx13"
    ;    if exist "%~dpnx12" ren "%~dpnx12" "%~nx13"
    ;    if exist "%~dpnx11" ren "%~dpnx11" "%~nx12"
    ;    if exist "%~1" ren "%~1" "%~nx11"
    ;    exit
  }
}
<< Назад © 2005—2008, Андрей Салмов
Hosted by uCoz