1 (изменено: surefire, 2011-08-18 20:21:07)

Тема: AHK: отдельный CapsLock для каждого окна

Началось с того, что я сделал переключение раскладки по CapsLock, а самого CapsLock по Ctrl+Shift. Но сделал это стандартными средствами винды при помощи Microsoft Keyboard Layout Creator. Таким образом осталась проблема переключения раскладки (в данном случае CapsLock) на каждое приложение, а не целиком в системе. Предлагаю скрипт для AutoHotkey_L: 


Gui +LastFound
DllCall( "RegisterShellHookWindow", UInt,WinExist() )                        ; Ставим системный хук
MsgNum := DllCall( "RegisterWindowMessage", Str,"SHELLHOOK" )     
OnMessage( MsgNum, "WaitSwitchWindow" )                                      ; Подписываемся на сообщения системы
LastActiveWindowID := WinActive("A")                                           ; Сохраняем идентификатор активного окна
caps := {}                                                                                 ; Инициализируем массив

Return ;                                          // End of Auto-Execute Section //

WaitSwitchWindow( wParam, lParam )  {
  Global LastActiveWindowID, caps
  If ( wParam = 4 And WinExist( "ahk_id " lParam )  ) { ; HSHELL_WINDOWACTIVATED = 4       ; Фильтруем системные сообщения 
       caps[LastActiveWindowID] :=  GetKeyState("CapsLock", "T")        ; Сохраняем состояние CapsLock для бывшего активного окна
 
       LastActiveWindowID := lParam                               ; Сохраняем идентификатор нового активного окна
       SetCapsLockState, % caps[LastActiveWindowID] ? "On" : "Off"   ; Устанавливаем состояние CapsLock для нового активного окна 
  }
}

2

Re: AHK: отдельный CapsLock для каждого окна

как оказалось во время блокировки WinGet, active_id, ID, A  выдает пустоту вмеcто id, а WinWaitNotActive, ahk_id %active_id%  в этом случае ничего не ждет и цикл зацикливается, элегантного решения еще не придумал.

3 (изменено: YMP, 2011-08-16 17:57:09)

Re: AHK: отдельный CapsLock для каждого окна

Что-то не пойму. Если под раскладкой разумеется язык ввода, то он и так у каждого окна свой. На какой переключили окно, тот в нём и будет, независимо от других окон.

Или вы индикатор CapsLock имеете в виду?

4

Re: AHK: отдельный CapsLock для каждого окна

Я имею ввиду именно индикатор CaspLock, он у меня переключает раскладку, без всяких посторонних программ. Вся хитрость в программе Microsoft Keyboard Layout Creator, чуть подробней написано здесь, я пошел чуть дальше, но это пока не важно, меня интересовал именно настоящий CapsLock. Сделал скрипт, все хорошо, проблема осталась только при блокировке экрана, а её приходится делать довольно часто.

5

Re: AHK: отдельный CapsLock для каждого окна

Если нежелательность "зацикливания цикла" в том, что он сильно грузит процессор, то можно в этом случае вставлять небольшую паузу.

caps := {}

Loop
{
   WinGet, active_id, ID, A
   If active_id
   {
      SetCapsLockState, % caps[active_id] ? "On" : "Off" 

      WinWaitNotActive, ahk_id %active_id% 

      caps[active_id]:=  GetKeyState("CapsLock", "T")
   }
   Else
      Sleep, 300
}

6

Re: AHK: отдельный CapsLock для каждого окна

Хочется именно без костылей, я уже решил. Точнее нашел решение на английском форуме ))) Сейчас исправлю скрипт.

7

Re: AHK: отдельный CapsLock для каждого окна

Выглядит как целая куча костылей. Со Sleep гораздо проще и понятнее. Да и короче.

8

Re: AHK: отдельный CapsLock для каждого окна

Во общем оба варианта имеют право на существование, пусть каждый сам кто захочет использовать, для себя решит, что больше по вкусу.