13 ноября 2012 г.

Как сделать раскладку клавиатуры аля-Mac в Windows?

Очень многие пользователи используют несколько ОС на одном компьютере (Windows, Mac OS X, Linux). Одни используют загрузчики и сначала работают в одной среде, потом перегружаются во вторую. Другие используют виртуальные среды и работают в обеих ОС одновременно (VMWare,  Paralles, VirtualBox, Hyper-V).  Я работаю в связке Mac OS X Mountain Lion + Windows 7 (VMWare Fusion).

В определенный момент я начал испытывать дискомфорт при использовании горячих клавиш, работая в обеих ОС одновременно. Приведу примеры:
  • Cmd+C, Cmd+V, Cmd+X (Ctrl+C, Ctrl+V, Ctrl+X) - то есть горячие клавишы редактирования документов.
  • Переключение между языками (Cmd+Space - Ctrl + Shift)
  • Раскладка клавиатуры Apple Keyboard отличается от PC-раскладки, например символы точки, запятой, двоеточие и т.д.
Такие мелкие отличия постоянно сбивали и приходилось выполнять одну и туже команду несколько раз, а иногда и три и четыре раза. Поэтому хотелось получить одинаковую раскладку во всех ОС.



Я использую клавиатуру Apple Wireless Keyboard. По удобству Apple раскладка меня всем устраивает, поэтому хотелось, чтобы в ОС Windows было тоже самое.

В сети Интернет приводится множество примеров, как можно решить проблему одинаковой раскладки:

  • Правка реестра
  • Использование различных программ мапинга клавиш
  • Установка РС-раскладки в Mac OS X

Большинство методов малофункциональны, не всегда отрабатывают или вовсе используют PC-раскладку. Испробовав множество решений, выработал свое видение. 

Для решения проблемы была выбрана программа AutoHotKey (http://www.autohotkey.com).  AutoHotKey - бесплатная open-source программа для создания макросов и автоматизации, позволяющая упростить повторяющиеся задачи.
  1. Скачиваем с сайта программу и устанавливаем ее в ОС Windows.
  2. Запускаем программу. После появления программы в трее, правый клик по иконке -> Edit This Script.
  3. В открывшемся окне блокнота копируем скрипт:

;==========================================
;Смена раскладки клавиатуры через cmd+Shift+Space
;==========================================

#+sc039::PostMessage, 0x50, 2, 0,, A 
;#sc039::PostMessage, 0x50, 2, 0,, A      ; Cmd+Space работает в Windows XP 

;======================================================
;Выполнение команд независимо от языка через cmd+{Key}: 
;  Undo, Cut, Copy, Paste, Save, Find
;======================================================

#sc02C::SendInput ^{sc02C} ; Undo cmd+z
#sc02D::SendInput ^{sc02D} ; Cut cmd+x
#sc02E::SendInput ^{sc02E} ; Copycmd+c
#sc02F::SendInput ^{sc02F} ; Paste cmd+v
#sc031::SendInput ^{sc031} ; New cmd+n
#sc01E::SendInput ^{sc01E} ; Select All cmd+a
#sc01F::SendInput ^{sc01F} ; Save cmd+s
#sc021::SendInput ^{sc021} ; Find cmd+f
#sc018::SendInput ^{sc018} ; Open cmd+o
#sc011::SendInput ^{F4}   ; Close cmd+w
#sc014::SendInput ^{sc014} ; New Tab cmd+t
#sc013::SendInput ^{sc013} ; Reload cmd+r


;==============================================================
;Выполнение команд независимо от языка в MS Office через cmd+{Key}: 
;   Bold, Italic 
;==============================================================

#sc030::SendInput ^{sc030} ; Bold cmd+b
#sc017::SendInput ^{sc017} ; Italic cmd+i


;==============================================================
;Корректное отображение символов в соответсвии с RU/ENG Apple Keyboard
;==============================================================

$+5::CheckRus(":","%") ; Двоеточие через Shift+5
$+6::CheckRus(",","^") ; Запятая через Shift+6
$+7::CheckRus(".","&") ; Точка через Shift+7
$+8::CheckRus(";","*") ; Точка с запятой через Shift+8
$+/::CheckRus("?","?") ; Вопрос через Shift+/

CheckRus(rus,eng)
{
SetFormat, Integer, H
WinGet, WinID,, A
ThreadID:=DllCall("GetWindowThreadProcessId", "Int", WinID, "Int", 0)
InputLocaleID:=DllCall("GetKeyboardLayout", "Int", ThreadID)
if(InputLocaleID == "0x4190419")
{
Send %rus%
}
if(InputLocaleId == "0x4090409")
{
SendRaw %eng%
}
Return
}


    4. Сохраняем файл. 
Примечание: По умолчанию файл хранится в папке C:\Users\%Username%\Documents\AutoHotkey.ahk

    5. Правый клик по иконке AutoHotKey в трее -> Reload This Script. Перезагрузка не требуется.

    6. Для выполнения автоматической загрузки при старте Windows необходимо в папке Пуск -> Все Программы -> Автозагрузка создать ярлык на файл C:\Users\%Username%\Documents\AutoHotkey.ahk


P.S. К сожалению так и не удалось реализовать переключение языка через Cmd+Space в Windows 7. Данная комбинация жестко зашита в код ОС и не перехватывается программой.

P.S.S  Любые предложения и доработки можно легко добавить, скриптовый язык очень простой :).

8 комментариев:

  1. 1. Win8 смена языка по умолчанию Win+Space ))))

    2. Cmd+V в Екселе на Вин8 вызывает не только вставку, но и выпадающее меню :(

    ОтветитьУдалить
    Ответы
    1. Win8 не пользуюсь ((( Слишком много особенностей.

      Обратил внимание, что через Parallels в режиме Coherence в Win7 все работает на ура, без каких либо дополнительных программ и скриптов.

      Удалить
  2. Спасибо большое. Архиполезный скрипт. Только вот мне надо найти для control + b и заменить на command + b. Не подскажите где найти таблицу символов?

    ОтветитьУдалить
    Ответы
    1. Эта связка меняется скриптом в разделе:

      ;==============================================================
      ;Выполнение команд независимо от языка в MS Office через cmd+{Key}:
      ; Bold, Italic
      ;==============================================================

      #sc030::SendInput ^{sc030} ; Bold cmd+b
      #sc017::SendInput ^{sc017} ; Italic cmd+i


      Вы можете сами поймать все сочетания с помощью AutoHotkey:
      1) Откройте AutoHotkey
      2) Menu -> Key history and script info (Ctrl+k)
      3) Нажать много раз Control, затем F5 (или Fn+F5) чтобы увидеть результат по клавише Control (Колонка SC = 01D)
      4) Нажмите много раз b, затем F5 (или Fn+F5) чтобы увидеть результат по клавише b (Колонка SC = 030)
      5) Добавьте связку в конфиг:
      Control = ^
      Cmd = #

      #sc030::SendInput ^{sc030} ;

      Означает Отправить связку Cmd+b вместо Ctrl+b

      Удалить
  3. У меня на Windows 7 под VirtualBox для Cmd+Space работает вот это:

    #Space::PostMessage, 0x50, 2, 0,, A ; 0x50 is WM_INPUTLANGCHANGEREQUEST

    ОтветитьУдалить
  4. для смены языка нужна простая программа где можно задать комбинацию для переключения
    punto.yandex.ru

    работает отлично

    ОтветитьУдалить
  5. Огромное спасибо!

    Только есть один нюанс: функция CheckRus(rus,eng), например для запятой и точки на 6 и 7, почему-то не работает в Скайпе (переключение языка действует на все клавиши, кроме переназначенных с помощью CheckRus — они выводят знаки в соответствии с первоначальным языком) и Коммандной строки (не выводит значение переназначенных с CheckRus клавиш вообще).

    Помогите пожалуйста.

    ОтветитьУдалить
  6. Casino games on offer in Asia - Goyang FC
    Asia Gaming 바카라가입쿠폰 is one of the most popular gaming op 사이트 providers in the world. They are licensed 윌리엄힐 by 일반인후방 a Curacao authority and also conduct their 토토가입머니 own casino games.

    ОтветитьУдалить