1 (изменено: HideGenius, 2015-02-10 01:47:46)

Тема: AHK: Маленький индикатор раскладки в любом участке экрана

Искал на форуме, но так и не нашел индикатора раскладки.
Punto не нужен, а вот простой кубик 18х18 пикселей "alwaysontop" с буквой U или E в зависимости от раскладки в точке на экране в котороую я поставлю, нужен.
Можете помочь?

2

Re: AHK: Маленький индикатор раскладки в любом участке экрана

AmlMaple не пробовали?

3 (изменено: Malcev, 2015-02-09 14:28:11)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Я пользуюсь таким вариантом:

Color1 := "0x0C0BC0", Color2 := "0x0FFC00", x := 1000, y := 500, w := 18, h := 18
loop
{   
   If (InputLayout() = "Russian")
   {   
      Gui, +AlwaysOnTop -Caption +ToolWindow +LastFound
      Gui, Color, % Color1
      Gui, Show, x%x% y%y% w%w% h%h% NA
   }
   Else If (InputLayout() = "English")
   {   
      Gui, +AlwaysOnTop -Caption +ToolWindow +LastFound
      Gui, Color, % Color2
      Gui, Show, x%x% y%y% w%w% h%h% NA
   }
   sleep, 50
}

InputLayout()
{
    ThreadID := DllCall("GetWindowThreadProcessId", "Int", WinExist("A"), "Int", 0)
    HKL := DllCall("GetKeyboardLayout", "uint", ThreadID, "UShort")
    VarSetCapacity(sKbd, 260, 0)
    DllCall("GetLocaleInfo", "uint", HKL
                           , "uint", 0x1001
                           , "str",  sKbd
                           , "uint", 260)
    Return sKbd
}

4 (изменено: Alectric, 2015-02-09 20:51:22)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Лучше так:

#NoEnv
SetBatchLines,-1
CoordMode,Mouse,Screen
CoordMode,tooltip,Screen
CoordMode,Caret,Screen
SetKeyDelay,0
SetWinDelay,20
Color1 := "0x0C0BC0", Color2 := "0x0FFC00", x := 1000, y := 500, w := 18, h := 18
Gui, +AlwaysOnTop -Caption +ToolWindow +LastFound
Gui, Show, x%x% y%y% w%w% h%h% NA
hGui:=WinExist()
loop
{
   MouseGetPos,,,mwin
   oldlang:=lang
   lang:=InputLayout()
   if (oldlang!=lang)
   If (lang = "Russian")
   {
      ToolTip,Русский,A_CaretX+10,A_CaretY-20
      SetTimer,RemoveToolTip,-1000
      Gui, Color, % Color1
      Gui, Show, NA
   }
   Else If (lang = "English")
   {
      ToolTip,English,A_CaretX+10,A_CaretY-20
      SetTimer,RemoveToolTip,-1000
      Gui, Color, % Color2
      Gui, Show, NA
   }
   Gui, +AlwaysOnTop
   sleep, 50
}

RemoveToolTip:
tooltip
return

#if (mwin=hGui)
lbutton::
MoveWin(hGui)
return
#if

MoveWin(hwnd,key="lbutton")
{
  MouseGetPos,oldmmx,oldmmy
  while GetKeyState(key,"P")
  {
    sleep,10
    MouseGetPos,mmx,mmy
    WinGetPos,wx,wy,ww,wh,ahk_id %hwnd%
    wx:=wx+mmx-oldmmx
    wy:=wy+mmy-oldmmy
    WinMove,ahk_id %hwnd%,,%wx%,%wy%
    oldmmx:=mmx
    oldmmy:=mmy
  }
  return
}

InputLayout()
{
    WinGetClass, Class, % "ahk_id" hID := WinExist("A")
    if !id := DllCall("GetWindow", Ptr, hid, UInt, GW_OWNER := 4, Ptr)
      id:=hID
    ThreadID := DllCall("GetWindowThreadProcessId", "Int", id, "Int", 0)
    HKL := DllCall("GetKeyboardLayout", "uint", ThreadID, "UShort")
    VarSetCapacity(sKbd, 260, 0)
    DllCall("GetLocaleInfo", "uint", HKL
                           , "uint", 0x1001
                           , "str",  sKbd
                           , "uint", 260)
    Return sKbd
}
Win 10 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

5

Re: AHK: Маленький индикатор раскладки в любом участке экрана

А чем лучше?
Над панелью задач цвет при переключении языка не меняется.

6 (изменено: Alectric, 2015-02-09 19:09:03)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

В смысле "над панелью задач"?

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

Win 10 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

7

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Если квадратик находится над Windows Task Manager.
И еще при переключении языков иногда у курсора появляются часы, что мешает.

8 (изменено: Alectric, 2015-02-09 19:21:49)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

А~а.
Просто:

    WinGetClass, Class, % "ahk_id" ID := WinExist("A")
    if (Class = "#32770")
      id := DllCall("GetWindow", Ptr, id, UInt, GW_OWNER := 4, Ptr)

Клас таск манагера "#32770", а родильского окна у него нет.

Попробую исправить...

Про часы не знаю что сказать...


Upd:
Исправил.
Кроме часов... возможно несовместимость где-то с Вашими скриптами...

Win 10 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

9

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Да, так все работает.
После перезагрузки компьютера часы исчезли.

10 (изменено: Alectric, 2015-02-09 20:52:20)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Еще ошибка закралась там-же, исправил.

Win 10 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

11

Re: AHK: Маленький индикатор раскладки в любом участке экрана

А как Укр. добавить? Вместо Рус.

12

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Спасибо всем!

13

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Измени текст в tooltip на свой.

Win 10 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

14 (изменено: monsoon, 2015-03-03 11:01:25)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Интересная тема.
Как говорится: "аппетит приходит во время еды".
Вот бы:
вместо квадратиков использовать bitmap с флажком
добавить настройку прозрачности
флажок перемещать к текстовому курсору (каретке) 

А возможно ли с помощью ahk отрисовывать цветной текстовый курсор (каретку) как в программе amlmaple?

15

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Текстовый курсор - в смысле каретка? Нужно как-то получать её координаты для конкретной программы.

16

Re: AHK: Маленький индикатор раскладки в любом участке экрана

ypppu
Курсор мыши, по-моему, нельзя назвать текстовым, но поправил, чтобы не было разночтений.

17

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Тогда определитесь, у какого курсора планируете отрисовывать индикатор?

+ открыть спойлер

http://savepic.su/5208743.png

18

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Текстовый курсор - это вроде курсор IBEAM. А каретка - это не курсор, она не управляется мышью.

19 (изменено: monsoon, 2015-03-03 10:57:22)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Irbis
Как уже писал у текстового курсора, а не у курсора (указателя) мыши. На вашем рисунке - верхний.
 

ypppu пишет:

А каретка - это не курсор, она не управляется мышью.

Из вики:

The flashing text cursor may be called a caret, as in caret browsing. The mouse cursor is also called a pointer...

И еще из статьи "Caret (disambiguation)":

Cursor (computing), a blinking vertical bar
Caret navigation, a blinking vertical bar in a text field

 
P.S. если кому-то интересен мышиный, а не текстовый курсор, есть пример отображения текущего времени у курсора (указателя) мыши на donationcoder.com

20

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Убедил. Курсор - общее понятие, а "указатель" и "каретка" - частные случаи.

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

21 (изменено: Irbis, 2015-03-03 22:51:20)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

На основе кода из этой темы. Отредактировано ввиду конструктивной критики модератора. ))

CoordMode, Tooltip, Client
VarSetCapacity(Point, 8, 0)
Loop {
   DllCall("AttachThreadInput"
          ,"Ptr",ahkTID:=DllCall("GetCurrentThreadId")
          ,"Ptr",appTID:=DllCall("GetWindowThreadProcessId", "Ptr",WinActive("A"), "UInt",0)
          ,"UInt",1)
   DllCall("GetCaretPos", "Ptr",&Point)
   tooltip, % X:=10+NumGet(Point, 0, "UInt") "," Y:=NumGet(Point, 4, "UInt"), X, Y
   DllCall("AttachThreadInput", "Ptr",ahkTID, "Ptr",appTID, "UInt",0)
   Sleep 100
}

F12:: ExitApp

В блокноте, опере - работает. В notepad++ тоже, но со смещением, возможно, нужно учитывать положение контрола.

22

Re: AHK: Маленький индикатор раскладки в любом участке экрана

А как у вас WinActive("A") и другие поинтеры с размерностью «uint» получились? А координаты — наоборот вдруг «ptr» оказались?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

23

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Не у меня, я ссылку на тему привел. По-хорошему, надо привести к нормальному виду, конечно, ибо работает только на х86 системе из-за совпадения размерности типов "Ptr" и (U)"Int".

24

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Ох уж эти любители ссылок на AHK-basic!

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

25

Re: AHK: Маленький индикатор раскладки в любом участке экрана

teadrinker пишет:

А как у вас WinActive("A") и другие поинтеры

Давно интересует вопрос, почему некоторые люди пишут слово "пойнтер" через "и". Ну вот, наконец-то есть у кого спросить. Так почему?

26

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Хм, а почему бы нет?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

27

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Неестественно.

28

Re: AHK: Маленький индикатор раскладки в любом участке экрана

А, не обращай внимания.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

29 (изменено: Irbis, 2015-03-05 00:20:49)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

ypppu пишет:

<...> Но как получить координаты курсора-каретки - проблема. Если он немигающий - ещё можно поизгаляться.

Видимо, что-то я недопонимаю, но чем плох пример из справки AHK про встроенные переменные A_CaretX & A_CaretY? Добавить немного красок, и вуаля

#Persistent
Color1 := "0x0C0BC0", Color2 := "0xC00C0B", w := 10, h := 12
Gui, +AlwaysOnTop -Caption +ToolWindow +LastFound +HwndGuiHwnd
WinSet, Transparent, 128
SetTimer, WatchCaret, 100
return
WatchCaret:
   If (InputLayout() = "Russian")
      Gui, Color, % Color2
   Else
      Gui, Color, % Color1
      WinGetPos, x, y,,,A
      x+=A_CaretX+10, y+=A_CaretY
      if x&&y&&(GuiHwnd!=WinExist("A"))
         Gui, Show, x%x% y%y% w%w% h%h% NA
      else
         Gui, Hide
Return

InputLayout()
{
    ThreadID := DllCall("GetWindowThreadProcessId", "Ptr", WinExist("A"), "Int", 0)
    HKL := DllCall("GetKeyboardLayout", "uint", ThreadID, "UShort")
    VarSetCapacity(sKbd, 260, 0)
    DllCall("GetLocaleInfo", "uint", HKL
                           , "uint", 0x1001
                           , "str",  sKbd
                           , "uint", 260)
    Return sKbd
}

30

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Только опять у вас

"Int", WinExist("A")

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

31

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Irbis пишет:

чем плох пример из справки AHK про встроенные переменные A_CaretX & A_CaretY?

Многие программы использует не стандартный элемент управления Edit.

32

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

33

Re: AHK: Маленький индикатор раскладки в любом участке экрана

teadrinker, исправил (пост #21 тоже). Кстати, функция перекочевала из поста Malcev'а, ох уж эти двойные стандарты.

34

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Irbis пишет:

ох уж эти двойные стандарты.

Ну за всеми-то не уследишь! Тут, как говорится: "А если все начнут с крыши прыгать, ты тоже прыгнешь?"

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

35

Re: AHK: Маленький индикатор раскладки в любом участке экрана

+ OFF

Правописание не и ни

§ 89. Не пишется раздельно:
3. При существительных, прилагательных и наречиях, если есть или подразумевается противопоставление

Например: "многие программы использует не стандартный элемент управления Edit, а нестандартный элемент управления".

36

Re: AHK: Маленький индикатор раскладки в любом участке экрана

+ OFF
ypppu пишет:

§ 89. Не пишется раздельно:
3. При существительных, прилагательных и наречиях, если есть или подразумевается противопоставление

Например: "многие программы использует не стандартный элемент управления Edit, а нестандартный элемент управления".

Всё правильно, у тебя-то противопоставление где?

ypppu пишет:

Многие программы использует не стандартный элемент управления Edit.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

37

Re: AHK: Маленький индикатор раскладки в любом участке экрана

+ OFF(3)

Загуглил ради интереса фразу "подразумевается противопоставление", и на сайте znanija.com,в шапке которого красуется "Школьные знания.com", нашел гениальную фразу -
НЕ С ДЕЕПРИЧАСТИЯМИ ОБЫЧНО ПИШЕТЬСЯ РАЗАДЕЛЬНО.
И еще море, как сейчас говорят, лулзов, что было бы смешно, если бы не было так грустно...

38

Re: AHK: Маленький индикатор раскладки в любом участке экрана

+ OFF
teadrinker пишет:

Всё правильно, у тебя-то противопоставление где?

Для кого я подчёркивал и пример приводил? http://www.kolobok.us/smiles/light_skin/facepalm.gif

39

Re: AHK: Маленький индикатор раскладки в любом участке экрана

+ OFF
ypppu пишет:

Для кого я подчёркивал и пример приводил?

Не знаю, в примере, хоть и «кривобокое», но противопоставление есть, а в изначальном варианте — нет, и ничего не говорит о том, что оно подразумевается.
НЕ с прилагательными:

Река мелкая? Река не мелкая.

Вот тут подразумевается.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

40

Re: AHK: Маленький индикатор раскладки в любом участке экрана

+ OFF

Вот Irbis привёл код, подразумевая что э. у. стандартный. В ответ я противопоставил ему, что в других программах текстовый э. у. может быть не стандартным [, а самодельным].
Ещё простейший пример:

Петрович: "Плюс десять, воздух холодный". Кузьмич: "Воздух не холодный".

41

Re: AHK: Маленький индикатор раскладки в любом участке экрана

+ OFF

Подразумевание должно быть очевидным в диалоге.
"Не холодный и не горячий (двойное отрицание, тут подразумеваем тёплый) чай."
"Не слабый ты (подразумеваем - иной), просто не повезло."
"Неслабый у тебя получился приёмчик." (А тут нет).

В последнем примере (как и в примере с рекой, собственно) двое спорят.
А: Я говорю - холодный.
B: А я говорю - не холодный. (Здесь чёткое противопоставление слову холодный.)

Обратная картина того же спора:
А: Воздух нетёплый!
В: А я говорю - нехолодный! (Тут нет противопоставления.)

42

Re: AHK: Маленький индикатор раскладки в любом участке экрана

+ OFF
ypppu пишет:

Irbis привёл код, подразумевая что э. у. стандартный. В ответ я противопоставил ему

Подразумеваемое противопоставление подразумеваемому утверждению? Звучит столь же забавно, сколь и неубедительно. (Представь, что я бы сейчас написал «не убедительно», подразумевая, что ты подразумеваешь, что убедительно.) Может, Irbis вообще не знал, что эти переменные определяют каретку только в стандартных контролах, и, соответственно, ничего такого не подразумевал. Как верно выше подметил коллега Flasher

Подразумевание должно быть очевидным в диалоге.

как это и видно из всех приводимых тобой же примеров.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

43

Re: AHK: Маленький индикатор раскладки в любом участке экрана

+ OFF

teadrinker
А что ж своим советом не обращать внимания не воспользуешься?

44

Re: AHK: Маленький индикатор раскладки в любом участке экрана

+ OFF

Тут совсем другой случай!

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

45 (изменено: YMP, 2015-03-04 09:43:05)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

+ OFF

Это как сказать. В обоих случаях нарушена норма русского языка. Ведь слово "пойнтер" уже есть. Правда оно обозначало раньше только породу собак, но ведь происходит оно от того же английского "pointer". Т.е. есть устоявшаяся русская транскрипция этого слова.

46

Re: AHK: Маленький индикатор раскладки в любом участке экрана

+ OFF

Разница в том, что в этом случае никто не спорит.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

47

Re: AHK: Маленький индикатор раскладки в любом участке экрана

+ OFF

В котором? Кто и о чём не спорит?

48 (изменено: ypppu, 2015-03-04 14:09:01)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

+ OFF

Не знаю, в примере, хоть и «кривобокое», но...

Может, Irbis вообще не знал...

Такие доказательства сражают наповал. Прочитать сообщение, адресованное другому человеку, прочитать его мысли, сделать предположение и предъявить его в качестве аргумента... Зачёт!

49

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Irbis пишет:

Видимо, что-то я недопонимаю, но чем плох пример из справки AHK про встроенные переменные A_CaretX & A_CaretY? Добавить немного красок, и вуаля

Интересный эффект, если кликнуть по индикатору мышкой.

50 (изменено: Irbis, 2015-03-05 00:26:32)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Убрал "интересный эффект". В принципе, на клик по индикатору можно и действие задать - например, скопировать выделенный текст, или просто переключить язык.

51 (изменено: monsoon, 2015-03-05 16:59:21)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Irbis
Сейчас работает без эффектов + эта версия в отличие от предложенной на первой странице и в notepad++ не смещается. http://forum24.ru/gif/smk/sm36.gif
 
Мне кажется, автор amlmaple  использовал тот же принцип. Если в её настройках задать курсор шириной 10px, выглядит это вот так:
http://screenshotuploader.com/i/1503/p292q.jpg

Похоже она еще скрывает системный курсор в программах, которые это позволяют,  и добавляет по таймеру мерцание к своему искусственному. Но в некоторых программах из-за этого может взять и внезапно пропасть курсор напрочь.
Также есть возможность отображать еще раскладку флагом и/или названием языка. Имхо, все три возможности как на скриншоте вряд ли кто-то использует.
К плюсам отображения названия языка можно отнести то, что в какой-то последней версии добавлено отображение Сapslok:
http://screenshotuploader.com/i/1503/k15_q.jpg
Но отображение Сapslock глючит (не всегда отображает) при переключении и размер больших букв, по-моему, великоват.
Флаг кстати тоже зачем-то скрывается, если нет активности и начинает отображаться при перемещении курсора или переключении раскладки.
Флаг это наверняка bitmap, а буквенное отображение названия языка?
Можно ли какую-нибудь из этих возможностей добавить к скрипту ahk?

Irbis пишет:

в принципе, на клик по индикатору можно и действие задать - например, скопировать выделенный текст, или просто переключить язык.

Переключение раскладки, по-моему, лучше подходит.

52

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Irbis
Есть еще один неприятный эффект - у меня перестает работать двойной клик мыши.
Если завершить работу скрипта или поставить его на паузу, начинает работать.

53 (изменено: Irbis, 2015-03-06 17:46:08)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Проблема с двойным кликом известна создателю Autohotkey. Как написано в справке, такое происходит при частом (чаще 1 раз в 500мс) опросе положения каретки, причина неизвестна. Как выход могу предложить сделать временное отключение таймера при клике ЛКМ. Добавил переключение языка, немного видоизменил код.

Индикатор в виде флага + состояние Caps Lock можно добавить, хотя не вижу в этом особого смысла: наличие таких "свистелок" понятно в коммерческом продукте, психолгия покупателя работает так, что в его понятии "больше = лучше", ему кажется, что выгодней взять супермеганавороченный "комбайн", чем скромный продукт, хотя в первой программе он будет пользоваться от силы пятой частью ее возможностей.

А по факту - эргономичность работы с цветным флагом у текстового курсора под большим вопросом, особенно когда курсор в середине текста, и флаг частично перекрывает текст. Монохромный курсор в этом плане мне кажется более удобным.

CoordMode, Caret
Color:={"English":"0x0C0BC0", "Russian":"0xC00C0B"}, w0:=10, h0:=12, w1:=15, h1:=18
Gui, +AlwaysOnTop -Caption +ToolWindow +LastFound +HwndGuiHwnd
WinSet, Transparent, 100
SetTimer, WatchCaret, 50
return

~LButton::
   SetTimer, WatchCaret, Off
   Sleep 500
   SetTimer, WatchCaret, On
Return

#if (GuiHwnd=id) 
LButton:: PostMessage, 0x50, 2,,, A
#If

WatchCaret:
   MouseGetPos,,,id
   Gui, Color, % Color[InputLayout()]
   w := GetKeyState("CapsLock", "T") ? w1 : w0, h := GetKeyState("CapsLock", "T") ? h1 : h0
   Gui, % (x:=A_CaretX+10)&&(y:=A_CaretY)&&(GuiHwnd!=WinExist("A")) ? "Show" : "Hide"
          , x%x% y%y% w%w% h%h% NA
Return

InputLayout() {
    VarSetCapacity(sKbd, 260, 0)
    DllCall("GetLocaleInfo", "UInt", DllCall("GetKeyboardLayout"
       ,"UInt", DllCall("GetWindowThreadProcessId", "Ptr", WinExist("A")
       , "Int", 0), "UShort"), "UInt", 0x1001, "Str", sKbd, "UInt", 260)
    Return sKbd
}

Upd: Состояние Caps Lock добавил, курсором другого размера. Можно убрать при ненадобности.

54 (изменено: monsoon, 2015-03-07 20:14:45)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Irbis пишет:

Как выход могу предложить сделать временное отключение таймера при клике ЛКМ.

У меня работает отлично, спасибо.
 

Irbis пишет:

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

Может быть и так. Но можно посмотреть на это и с другой стороны. У пользователя появляется выбор, какими "свистелками" ему пользоваться. Сам в amlmaple сначала использовал цветной 2-х пиксельный текстовый курсор и флаг, а потом из-за того, что флаг не всегда отображался, убрал его.
В прошлый раз писал, что все три варианта отображения вряд ли кто-то будет использовать. На мой взгляд флаг и буквенное отображение раскладки взаимоисключающие, хотя возможно находятся пользователи, включающие и то и другое. И еще флаг заинтересовал тем, что это единственный вариант отображения, который amlmaple может отобразить в консольном приложении (скорее всего для этого что-то пришлось дописывать в коде). Правда у меня в какой-то версии в cmd отображался, теперь по неизвестной причине - нет   но в виртуальной машине отображает.
 

Irbis пишет:

А по факту - эргономичность работы с цветным флагом у текстового курсора под большим вопросом, особенно когда курсор в середине текста, и флаг частично перекрывает текст. Монохромный курсор в этом плане мне кажется более удобным.

Неслучайно на 1-й странице написал "вот бы добавить настройку прозрачности"    И местоположение флага ведь тоже можно сдвинуть?
 
А вообще скрипт уже классный, использую его, отключив amlmaple. Чуть изменил (уменьшил) размер и расстояние от курсора . В этом как раз огромнейший плюс скрипта - каждый может настроить, как ему нравится.
Еще интересно, что индикатор скрипта может отображаться в меню, на кнопке, панели, т.е. в элементах, где нет курсора, но к недостаткам это не относится.

55

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Irbis
Скачал версию AutoHotkey 1.1.20.02 unicode (до этого у меня была AutoHotkey_L 1.1.07.02)
Индикатор стал виден в консольном приложении, например, cmd! Но только и для английской и для русской раскладки отображается цвет, указанный для "English".
Здесь вроде есть пример для определения языка ввода в консольном окне.

56

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Ок, вечером посмотрю. Есть ещё несколько идей, как улучшить работу скрипта.

57 (изменено: Irbis, 2015-03-18 15:23:52)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Добавил из предложенного выше примера определение языка для консольных приложений. Хоть у меня по-прежнему для cmd.exe координаты не определяются, но в PowerShell работает (win8.1 x32). Добавил возможность перетаскивать индикатор при помощи ЛКМ относительно текстового курсора.
Еще добавил небольшой мульти-буфер обмена, раз уж есть бесхозный индикатор, пусть отображет состояние. ))
Работает по принципу FIFO, то есть скопировал "аб", "вг", "де", потом последовательно вставил в таком же порядке.
Выделение ЛКМ+С - копировать в буфер, вырезать - ЛКМ+X, вставить - ЛКМ+V.
ЛКМ+ПКМ - показать буфер. Если отпустить ЛКМ, удерживая ПКМ - буфер очистится.
Функционал минимальный, не было цели создавать очередной МЕГАкомбайн.

#NoEnv
CoordMode Caret
CoordMode Tooltip
CoordMode Mouse
SetWinDelay -1
SetBatchLines -1
Color:={"English":"0x0C0BC0", "Russian":"0xC00C0B"}

oBuff:=[], OO := "`n 0  0 `n   _`n `n" ; ==== MultiClip
w0:=7, h0:=12, w1:=15, h1:=18, DX := 6, DY := 0
Gui, +AlwaysOnTop -Caption +ToolWindow +LastFound +HwndGuiHwnd
WinSet, Transparent, 120
gui, font, s7 w400
Gui, Add, Text,x0 y0 cWhite
SetTimer, WatchCaret, 50
return

#If (id=GuiHwnd)
LButton::
   SetTimer, WatchCaret, Off
   MouseGetPos, x0, y0
   WinGetPos xc, yc,,, ahk_id %GuiHwnd%
   xc-=x0, yc-=y0
   While GetKeyState("Lbutton", "P") {
      sleep 10
      MouseGetPos, xn, yn
      WinMove, ahk_id %GuiHwnd%,, xc+xn, yc+yn
   }
   DX+=xn-x0, DY+=yn-y0
   if A_TimeSinceThisHotkey < 400
      PostMessage, 0x50, 2,,, A
   SetTimer, WatchCaret, On
Return
#If
WatchCaret:
   MouseGetPos,,,id
   Gui, Color, % Color[InputLayout()]
   ControlSetText, Static1, % (Items:=oBuff.MaxIndex()) > 9 ? "+" : Items, ahk_id %GuiHwnd%
   w := GetKeyState("CapsLock", "T") ? w1 : w0, h := GetKeyState("CapsLock", "T") ? h1 : h0
   Gui, % (x:=A_CaretX+DX)&&(y:=A_CaretY+DY)&&(GuiHwnd!=WinExist("A")) ? "Show" : "Hide"
          , x%x% y%y% w%w% h%h% NA
Return

InputLayout(window := "A") {
   If !(hWnd := WinExist(window))
      return
   WinGetClass, Class
   if (Class == "ConsoleWindowClass"){
       WinGet, consolePID, PID
       DllCall("AttachConsole", Ptr, consolePID)
       VarSetCapacity(buff, 16)
       DllCall("GetConsoleKeyboardLayoutName", Str, buff),
       DllCall("FreeConsole")
       langID := "0x" . SubStr(buff, -3)
   }
   Else langID := DllCall("GetKeyboardLayout", Ptr, DllCall("GetWindowThreadProcessId", Ptr, hWnd, UInt, 0, Ptr), Ptr) & 0xFFFF
   Size := (DllCall("GetLocaleInfo", UInt, langID, UInt, 0x1001, UInt, 0, UInt, 0) * 2)   ; LOCALE_SENGLANGUAGE := 0x1001
   VarSetCapacity(localeSig, Size, 0)
   DllCall("GetLocaleInfo", UInt, langID, UInt, 0x1001, Str, localeSig, UInt, Size)
   return localeSig
}

; ============================================ MultiClip
~vk1 & vk43:: ; LButton & C
~vk1 & vk58:: ; LButton & X
   Clipboard =
   SendInput {Click up}
   SendInput % (A_ThisHotkey = "~vk1 & vk43") ? "^{Ins}" : "+{Del}"
   ClipWait, 1
   Sleep 100
   if !ErrorLevel {
      oBuff.Insert(Clipboard)
      tooltip % oBuff.MaxIndex()
      sleep 300
      tooltip
   }
Return

~vk1 & vk56:: ; LButton & V
   if oBuff.MaxIndex() {
      Clipboard := oBuff.Remove(1)
      SendInput {Click up}
      Sleep 100
      SendInput +{Ins}
      tooltip % oBuff.MaxIndex()
   } else tooltip % OO
   sleep 500
   tooltip
Return

~vk1 & vk2:: ; LButton & RButton
   r := ""
   for k,v in oBuff
      r .= k ":   " v "`n"
   tooltip % r ? r : OO
   KeyWait, vk1
   KeyWait, vk2, T0.1
   if ErrorLevel
      oBuff.Remove(1, oBuff.MaxIndex())
   tooltip
Return

58 (изменено: monsoon, 2015-03-19 18:07:17)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Irbis
Честно говоря немного удивили. Нет, претензий к скрипту нет, он как всегда впечатляет и впечатляет знание ahk. Однако писали про "комбайны" и сами же их начали создавать.
В 4-й версии amlmaple автор пытается прикрутить исправление текста, набранного не в той раскладке (сам пользуюсь скриптом teadrinker ). Это имеет отношение к раскладке, но буфер обмена - это вообще из другой оперы. Мне встречались по менеджеру буфера обмена какие-то ahk-скрипты, но и готовых как простых так и навороченных программ хватает на любой вкус.
Мне данные функции не нужны и их уберу, а тест без постоянного использования будет поверхностным, но кому-то данные возможности могут понравиться и пригодиться.

Но, вообще, ожидал альтернативное представление индикатора, например, флагом или попытку "пробить" индикатор, например, в таких программах как Firefox (интересует больше всего), Anki и т.д.
Почему опять про флаг? Знаю только две платных программы, отображающих индикатор языка возле каретки: AmlMaple и Сomfort Keys (это уже точно комбайн, кстати с менеджером clipboard ). В первой можно задать отображение флага вместе или отдельно от других способов, во второй - индикатор только в виде флага. Т.е., во-первых, это уже как бы стандарт. Во-вторых, флаг более заметен, особенно, это касается консольных приложений, где фон по умолчанию темный.

Теперь по FireFox.
AmlMaple у меня не отображает ни один из вариантов индикатора в FF, а в справке к ckeys написано: "Некоторые приложения отрисовывают текстовый курсор сами и не предоставляют информацию о его позиции. (Это Firefox, Google Chrome, OpenOffice, CorelDRAW, и т.д.) В этом случае плавающий значок не будет отображаться."
Однако у меня ckeys в FF флаг отображает:
http://s1.bild.me/bilder/030315/thumb_3713742screenshot_2015-03-19_001.png
Стрелкой или другим значком (задается в настройках) ckeys отображает CapsLock (можно отключить).
Но если переместить курсор от конца строки, флаг отображается в левом нижнем углу ниже контрола:
http://s1.bild.me/bilder/030315/thumb_3841800screenshot_2015-03-19_002.png 
http://s1.bild.me/bilder/030315/thumb_4864217screenshot_2015-03-19_001.png 
Если бы скриптовый индикатор отображался хотя бы так, было бы просто супер!

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

59 (изменено: Irbis, 2015-03-20 00:41:21)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Ну что ж, да будет флаг.
Другой индикации пока не добавил, состояние CapsLock - посредством "псевдотени". Остальное в принципе, тоже нетрудно прикрутить, было бы желание.

#NoEnv
CoordMode Caret
CoordMode Tooltip
CoordMode Mouse
SetWinDelay -1
SetBatchLines -1
SetWorkingDir %A_ScriptDir%
Color:={"English":"0x0C0BC0", "Russian":"0xC00C0B"}
w0:=16, h0:=12, w1:=20, h1:=16, DX := 8, DY := 0
Gui, +AlwaysOnTop -Caption +ToolWindow +LastFound +HwndGuiHwnd
Gui,Add, Picture,x4 y4, % FileFromUrl("Data\Shadow.png", "https://tr.im/vZ51e")
Gui,Add, Picture,x0 y0 +HwndIconEn, % FileFromUrl("Data\En.png", "https://tr.im/va4UW")
Gui,Add, Picture,x0 y0 +HwndIconRu, % FileFromUrl("Data\Ru.png", "https://tr.im/ukp67")
Gui, Color, 0x3F3F3F
WinSet, TransColor, 0x3F3F3F
SetTimer, WatchCaret, 50
return

#If (id=GuiHwnd)
LButton::
   SetTimer, WatchCaret, Off
   MouseGetPos, x0, y0
   WinGetPos xc, yc,,, ahk_id %GuiHwnd%
   xc-=x0, yc-=y0
   While GetKeyState("Lbutton", "P") {
      sleep 10
      MouseGetPos, xn, yn
      WinMove, ahk_id %GuiHwnd%,, xc+xn, yc+yn
   }
   DX+=xn-x0, DY+=yn-y0
   if A_TimeSinceThisHotkey < 400
      PostMessage, 0x50, 2,,, A
   SetTimer, WatchCaret, On
Return
#If

WatchCaret:
   MouseGetPos,,,id
   Control, % (InputLayout()="English") ? "Hide" : "Show",,,ahk_id %IconRu%
   w := GetKeyState("CapsLock", "T") ? w1 : w0, h := GetKeyState("CapsLock", "T") ? h1 : h0
   Gui, % (x:=A_CaretX+DX)&&(y:=A_CaretY+DY)&&(GuiHwnd!=WinExist("A")) ? "Show" : "Hide"
          , x%x% y%y% w%w% h%h% NA
Return

; скачивание недостающих ресурсов.
FileFromUrl(to, from) {
   if !FileExist(to)
   try {
      Loop, Parse, to, \
      {
         path .= path ? "\" . A_LoopField : A_LoopField
         if (to != path)
            FileCreateDir, %path%
      } UrlDownloadToFile, %from%, %to%
   } catch {
      MsgBox, 16,, Ошибка скачивания: %to%
       ExitApp
   } Return to
}

InputLayout(window := "A") {
   If !(hWnd := WinExist(window))
      return
   WinGetClass, Class
   if (Class == "ConsoleWindowClass"){
       WinGet, consolePID, PID
       DllCall("AttachConsole", Ptr, consolePID)
       VarSetCapacity(buff, 16)
       DllCall("GetConsoleKeyboardLayoutName", Str, buff),
       DllCall("FreeConsole")
       langID := "0x" . SubStr(buff, -3)
   }
   Else langID := DllCall("GetKeyboardLayout", Ptr, DllCall("GetWindowThreadProcessId", Ptr, hWnd, UInt, 0, Ptr), Ptr) & 0xFFFF
   Size := (DllCall("GetLocaleInfo", UInt, langID, UInt, 0x1001, UInt, 0, UInt, 0) * 2)   ; LOCALE_SENGLANGUAGE := 0x1001
   VarSetCapacity(localeSig, Size, 0)
   DllCall("GetLocaleInfo", UInt, langID, UInt, 0x1001, Str, localeSig, UInt, Size)
   return localeSig
}

60 (изменено: monsoon, 2015-03-24 13:02:41)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Irbis
Спасибо. Мечты сбываются
Остался только вопрос показа индикатора в приложениях, частично предоставляющих информацию о курсоре или не предоставляющих совсем.
Поиском по теме набрел на два интересных инструмента Accessible Info Viewer и AhkSpy
Если запустить AhkSpy и выделить с его помощью какую-нибудь область в FireFox, в нем в редактируемых контролах появляется отображение скриптового индикатора в начале строки (если строка пустая) или в конце непустой строки! Точно так же как при использовании программы Comfort Keys. Только в этом случае AhkSpy показывает координаты Caret Pos.
Непонятно как и какое влияние AhkSpy оказывает на Firefox, но отображение индикатора у меня сохраняется и после закрытия AhkSpy и после перезапуска скрипта с индикатором. Пропадает, если перезапустить FireFox.
У Chrome AhkSpy координаты  вообще нигде не определяет и видит только две области: адресную строку и все что ниже - вторая область. Для адресной строки хрома CKeys отображает курсор ниже ее слева внизу, для остальной, к сожалению, нет.

Можно ли добавить определение координат, как умеет AhkSpy?
Можно было бы в случае, если координаты удалось определить, отображать индикатор рядом с курсором, если нет - отобразить рядом с контролом или клиентской областью, какую удалось определить или внутри этой области, т.е. показывать всегда.
В своем скрипте вы реализовали фишку, до которой почему-то не додумались авторы указанных программ, а именно возможность перетянуть индикатор. Это можно было бы еще использовать, например, таким образом: добавить к индикатору контекстное меню с примерными названиями пунктов "привязать к каретке" и "открепить от каретки". При выборе второго пункта можно было бы запоминать позицию индикатора и отображать его всегда в этом месте. Вариант более сложный - запоминать позицию для открытых окон.

61

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Так и задумывается в итоге - есть некое дефолтное положение курсора, и для каждого приложения оно меняется индивидуально, с сохранением в ini файл. Еще думаю добавить настройку отображения индикатора для каждого приложения отдельно, то есть, к примеру в Notepad++ 95% времени включена английская раскладка, и индикатор мне нужен только для русской раскладки, в остальном он не нужен. Можно настроить переключение вида индикатора флаг/прямоугольник для определённых приложений.


Насчет получения координат через AccInfo  - посмотрю,  раз есть твой способ, грех им не воспользоваться.

Привязка/отвязка к каретке тоже давно планируется, способ будет довольно не тривиальный,  контекстное меню использовано не будет. 

62

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Irbis
Последний пост был таким многообещающим, и задумки вроде как все по делу, и даже интрига с нетривиальным способом реализации присутствует. 
Пропал интерес или возникли трудности?

63

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Интерес не пропал, и трудностей особых пока нет. Нехватка времени на разработку - основная проблема, хочется все идеи отшлифовать, чтоб не выкладывать полурабочий код.

64

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Irbis,
Обещанного 3 года ждут, жаль что прошло чуть более полгода. 
А если серьезно, раз нет времени можно ли поэтапно развивать скрипт?
Например, на первом этапе добавить более продвинутое определение координат?

65 (изменено: teadrinker, 2015-10-08 02:13:34)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Определение координат каретки через Accessible:

~LButton::
   CoordMode, Caret
   AccObj := AccObjectFromWindow(WinExist("A"), OBJID_CARET := 0xFFFFFFF8)
   oLocation := AccLocation(AccObj)
   ToolTip % "AccLocation.X = " oLocation.x "`nAccLocation.Y = " oLocation.y
           . "`n`nA_CaretX = " A_CaretX "`nA_CaretY = " A_CaretY
   Return


AccObjectFromWindow(hWnd, idObject = 0)
{
   static IID_IDispatch   := "{00020400-0000-0000-C000-000000000046}"
        , IID_IAccessible := "{618736e0-3c3d-11cf-810c-00aa00389b71}"
        , OBJID_NATIVEOM := 0xFFFFFFF0, VT_DISPATCH := 9, h := DllCall("LoadLibrary", Str, "oleacc", Ptr)
   
   VarSetCapacity(IID, 16)
   DllCall("ole32\CLSIDFromString", Str, idObject = OBJID_NATIVEOM ? IID_IDispatch : IID_IAccessible, Ptr, &IID)
   if DllCall("oleacc\AccessibleObjectFromWindow", Ptr, hWnd, UInt, idObject &= 0xFFFFFFFF, Ptr, &IID, PtrP, pAcc) = 0
      Return ComObjEnwrap(VT_DISPATCH, pAcc, 1)
}

AccLocation(Acc, ChildId=0)
{
;   VT_BYREF := 0x4000, VT_I4 := 3  ; 32-bit signed int
   try Acc.accLocation(ComObj(0x4003,&x:=0), ComObj(0x4003,&y:=0), ComObj(0x4003,&w:=0), ComObj(0x4003,&h:=0), ChildId)
   catch
      return
   return {x: NumGet(x, "int"), y: NumGet(y, "int"), w: NumGet(w, "int"), h: NumGet(h, "int")}
}

В FF и Опере определяет, в Хроме и блокноте — нет.

UPD: выяснилось, что в FF определяет не всегда, как и переменные A_CaretX и A_CaretY. От чего это зависит, пока не понял.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

66 (изменено: monsoon, 2015-10-15 22:10:32)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

teadrinker

Спасибо, что тоже присоединились.
У меня почему-то не работает в FF:
http://s1.bild.me/bilder/030315/thumb_3788762indic02.JPG 

AhkSpy.ahk показывает:
http://s1.bild.me/bilder/030315/thumb_5996278indic03.JPG 

Еще интересно, но похоже AhkSpy отображает координаты через A_CaretX и A_CaretY. Может как-то окно определяется особым образом?
И еще писал раньше, что этот скрипт определяет координаты в FF, если каретка находится после последнего символа (или когда пустой контрол).

67

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Ничего там особым образом не определяется.
У меня так в фаерфоксе работает:

#Persistent
SetTimer, WatchCaret, 100
return

WatchCaret:
ToolTip, X%A_CaretX% Y%A_CaretY%, A_CaretX, A_CaretY - 20
return

68

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Malcev

А у меня не показывает:
http://s1.bild.me/bilder/030315/thumb_9458564indic04.JPG 
 
Но стоит "натравить" на FF AhkSpy начинает показывать:
http://s1.bild.me/bilder/030315/thumb_4765705indic05.JPG

Так же и с индикатором  раскладки.

69 (изменено: Malcev, 2015-10-16 20:58:33)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Да, значит какой-то хук устанавливает ahk spy на выбранные окна.
Потому как работает так:
Запускаем ahk spy.
Активируем фаерфокс.
После этого позиция каретки будет определяться системой , даже если закроем ahk spy.
Тут уже надо подождать ответа автора программы - serzh82saratov, что там вызывается и остается в системе при выделении окна.

70

Re: AHK: Маленький индикатор раскладки в любом участке экрана

А автор тоже не знает.
У самого была мистика, на нестабильной системе не определялся пиксель в окне, без запущенного ahkspy.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

71 (изменено: Malcev, 2015-10-17 21:02:54)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Вот так у меня работает:
Заметил, что второй параметр функции (ROLE_SYSTEM_TEXT:= 0x2A) может быть любым - все-равно определяет.

#Persistent
SetBatchLines, -1
SetTimer, WatchCaret, 100
loop
{
   If !WinExist("ahk_class MozillaWindowClass")
   {
      WinWaitActive, ahk_class MozillaWindowClass
      SendInput, +{Tab}{Tab}
   }
   AccFirefox := Acc_ObjectFromWindow(WinExist("ahk_class MozillaWindowClass"))
   AccElem := SearchElement(AccFirefox, ROLE_SYSTEM_TEXT:= 0x2A)
   While WinExist("ahk_class MozillaWindowClass")
      sleep, 100
}
return

WatchCaret:
ToolTip, X%A_CaretX% Y%A_CaretY%, A_CaretX, A_CaretY - 20
return



SearchElement(ParentElement, Role)
{
   If (ParentElement.accRole(0) = Role)
      Return ParentElement

   for k, v in Acc_Children(ParentElement)
      if obj := SearchElement(v, Role)
         Return obj
}

72

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Ну да, это я тоже заметил, определяться начинает, если применить к окну FF какую-либо функцию получения acc-объекта. Причем, после этого определяется и через acc, и через A_Caret, видимо, там используется такой же механизм.

~LButton::
   Sleep, 100
   CoordMode, Caret
   (A_CaretX = "" && AccObjectFromPoint())
   ToolTip % "A_CaretX = " A_CaretX "`nA_CaretY = " A_CaretY
   Return

AccObjectFromPoint(ByRef _idChild_ = "", x = "", y = "")
{
   static VT_DISPATCH := 9, h := DllCall("LoadLibrary", Str, "oleacc", Ptr)
   
   (x = "" || y = "") ? DllCall("GetCursorPos", Int64P, pt) : pt := x & 0xFFFFFFFF | y << 32

   VarSetCapacity(varChild, 8 + 2*A_PtrSize, 0)
   if   DllCall("oleacc\AccessibleObjectFromPoint", Int64, pt, PtrP, pAcc, Ptr, &varChild) = 0
      Return ComObjEnwrap(VT_DISPATCH, pAcc, 1), _idChild_ := NumGet(varChild, 8, "UInt")
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

73 (изменено: monsoon, 2015-10-21 17:38:27)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Отлично! Спасибо!!!  http://forumsmile.ru/u/4/a/b/4abc005343e5529a530ca4f76876b2ad.gif
Работают оба варианта, выбрал вариант teadrinker, т.к. он показался более универсальным и не требует функций при запуске (перестало запрашивать, когда добавил через include Acc.ahk).

Можно ли ещё, если не определяются координаты каретки (например в FF, если адресная строка не пустая и курсор находится не в ее в конце) выдавать координаты левого нижнего угла контрола, в котором находится каретка или ближайшего выше по иерархии, для которого эти координаты возможно определить (это например для Хрома, Anki и т.п.)? Эта информация в AhkSpy вроде отображается в разделе AccInfo, но в скрипте интересующая область наводится мышью.
Comfort Keys, когда не определяются координаты, отображает флажок с раскладкой всегда в левом нижнем углу под контролом. Но в идеале, если есть возможность, определить попадают или нет в данный момент эти координаты в видимую область на экране и в случае если они не видны, показывать тогда координаты левого верхнего угла контрола.

А с привязкой к приложениям можно будет и подождать. Тем более, что у Irbis были на этот счет свои идеи.

74

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Господа про этот скрипт я узнал из этой темы http://forum.ru-board.com/topic.cgi?for … tart=80#lt . Опробовал AHKscript Lang_Indicator_by_Irbis_v3.7z вещь отличная . Главное не работает этот скрипт в браузерах maxthon и slimjet . Может есть обновлённый скрипт? Если есть решение выложите пожалуйста и спасибо за работу над скриптом.

75

Re: AHK: Маленький индикатор раскладки в любом участке экрана

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

А вот некоторые замечания по использованию скрипта от Irbis'а в Хроме: дело в том, что, похоже, у хрома есть как бы два отдельных состояния выбранного языка, например, английский в адресной строке и отображается английский флаг (и это же значение возвращает функция определения раскладки, которую я нашел в коллекции скриптов), а к примеру в поле быстрого ответа на этом форуме уже русский и флаг не появляется (функция по прежнему возвращает английский). А вот индикатор в трее показывает показывает в этих случаях верный язык.

Кстати, сам пользовался AlpMaple. Много других подобных программ перепробовал, щас название не вспомню. Последнее, что я нашел и пользуюсь --- langcursor https://habrahabr.ru/post/138940/, может пригодится кому.
Жду когда выйдет обещанная новая версия скрипта от Irbis'а, надеюсь автор не забросил свой проект.

76

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Спасибо Ирбису за программу!

Работает даже в консольных приложениях!

Обнаружил глюк: на WinXP x64 не показывает язык в пакетах OpenOffice и LibreOffice.

Есть пожелание: изменять цвет иконки в трее в зависимости от языка.

77 (изменено: monsoon, 2016-11-11 12:13:29)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

upsi_daezium пишет:

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

Выкладывал в теме руборда (в шапке скомпилированная версия, на 4-й странице - исходники), ссылка на руборд на предыдущей странице.
Но, конечно,  здесь тоже нужно продублировать.
Версия с флагом:


;  Автор скрипта Irbis
;  http://forum.script-coding.com/viewtopic.php?id=10392&p=3  
 
#NoEnv
CoordMode Caret
CoordMode Tooltip
CoordMode Mouse
SetWinDelay -1
SetBatchLines -1
SetWorkingDir %A_ScriptDir%
Color:={"English":"0x0C0BC0", "Russian":"0xC00C0B"}
w0:=16, h0:=12, w1:=20, h1:=16, DX := 8, DY := 0
Gui, +AlwaysOnTop -Caption +ToolWindow +LastFound +HwndGuiHwnd
Gui,Add, Picture,x4 y4, % FileFromUrl("Data\Shadow.png", "http://s1.bild.me/bilder/240416/5476034Shadow.png")
Gui,Add, Picture,x0 y0 +HwndIconEn, % FileFromUrl("Data\En.png", "http://s1.bild.me/bilder/240416/3631999En.png")
Gui,Add, Picture,x0 y0 +HwndIconRu, % FileFromUrl("Data\Ru.png", "http://s1.bild.me/bilder/240416/5042572Ru.png")
Gui, Color, 0x3F3F3F
WinSet, TransColor, 0x3F3F3F
SetTimer, WatchCaret, 50
return
 
#If (id=GuiHwnd)
LButton::
   SetTimer, WatchCaret, Off
   MouseGetPos, x0, y0
   WinGetPos xc, yc,,, ahk_id %GuiHwnd%
   xc-=x0, yc-=y0
   While GetKeyState("Lbutton", "P") {
      sleep 10
      MouseGetPos, xn, yn
      WinMove, ahk_id %GuiHwnd%,, xc+xn, yc+yn
   }
   DX+=xn-x0, DY+=yn-y0
   if A_TimeSinceThisHotkey < 400
      PostMessage, 0x50, 2,,, A
   SetTimer, WatchCaret, On
Return
#If
 
WatchCaret:
   MouseGetPos,,,id
   Control, % (InputLayout()="English") ? "Hide" : "Show",,,ahk_id %IconRu%
   w := GetKeyState("CapsLock", "T") ? w1 : w0, h := GetKeyState("CapsLock", "T") ? h1 : h0
 
   (A_CaretX = "" && AccObjectFromPoint())
 
   Gui, % (x:=A_CaretX+DX)&&(y:=A_CaretY+DY)&&(GuiHwnd!=WinExist("A")) ? "Show" : "Hide"
          , x%x% y%y% w%w% h%h% NA
Return
 
; скачивание недостающих ресурсов.
FileFromUrl(to, from) {
   if !FileExist(to)
   try {
      Loop, Parse, to, \
      {
         path .= path ? "\" . A_LoopField : A_LoopField
         if (to != path)
            FileCreateDir, %path%
      } UrlDownloadToFile, %from%, %to%
   } catch {
      MsgBox, 16,, Ошибка скачивания: %to%
       ExitApp
   } Return to
}
 
InputLayout(window := "A") {
   If !(hWnd := WinExist(window))
      return
   WinGetClass, Class
   if (Class == "ConsoleWindowClass"){
       WinGet, consolePID, PID
       DllCall("AttachConsole", Ptr, consolePID)
       VarSetCapacity(buff, 16)
       DllCall("GetConsoleKeyboardLayoutName", Str, buff),
       DllCall("FreeConsole")
       langID := "0x" . SubStr(buff, -3)
   }
   Else langID := DllCall("GetKeyboardLayout", Ptr, DllCall("GetWindowThreadProcessId", Ptr, hWnd, UInt, 0, Ptr), Ptr) & 0xFFFF
   Size := (DllCall("GetLocaleInfo", UInt, langID, UInt, 0x1001, UInt, 0, UInt, 0) * 2)   ; LOCALE_SENGLANGUAGE := 0x1001
   VarSetCapacity(localeSig, Size, 0)
   DllCall("GetLocaleInfo", UInt, langID, UInt, 0x1001, Str, localeSig, UInt, Size)
   return localeSig
}
 
AccObjectFromPoint(ByRef _idChild_ = "", x = "", y = "")
{
   static VT_DISPATCH := 9, h := DllCall("LoadLibrary", Str, "oleacc", Ptr)
   
   (x = "" || y = "") ? DllCall("GetCursorPos", Int64P, pt) : pt := x & 0xFFFFFFFF | y << 32
 
   VarSetCapacity(varChild, 8 + 2*A_PtrSize, 0)
   if   DllCall("oleacc\AccessibleObjectFromPoint", Int64, pt, PtrP, pAcc, Ptr, &varChild) = 0
      Return ComObjEnwrap(VT_DISPATCH, pAcc, 1), _idChild_ := NumGet(varChild, 8, "UInt")
} 

Кстати, исправил ссылки на png-файлы с tr.im на bild.me (скачиваются только в случае, если нет папки Data с необходимыми png).
 
Версия с цветным индикатором:


;  Автор скрипта Irbis
;http://forum.script-coding.com/viewtopic.php?id=10392&p=3  
 
#Persistent
CoordMode, Caret
Color:={"English":"0x0C0BC0", "Russian":"0xC00C0B"}  
;Color:={"English":"0x0000FF", "Russian":"0xFF0000"}
w0:=8, h0:=8, w1:=12, h1:=14
Gui, +AlwaysOnTop -Caption +ToolWindow +LastFound +HwndGuiHwnd
WinSet, Transparent, 100
SetTimer, WatchCaret, 50
return
 
~LButton::
   SetTimer, WatchCaret, Off
   Sleep 500
   SetTimer, WatchCaret, On
Return
 
#if (GuiHwnd=id)  
LButton:: PostMessage, 0x50, 2,,, A
#If
 
WatchCaret:
   MouseGetPos,,,id
;  Gui, Color, % Color[GetInputLangName(GetInputLangID("A")]
   Gui, Color, % Color[InputLayout()]
   w := GetKeyState("CapsLock", "T") ? w1 : w0, h := GetKeyState("CapsLock", "T") ? h1 : h0
 
   (A_CaretX = "" && AccObjectFromPoint())
 
   Gui, % (x:=A_CaretX+7)&&(y:=A_CaretY)&&(GuiHwnd!=WinExist("A")) ? "Show" : "Hide"
          , x%x% y%y% w%w% h%h% NA
Return
 
 
InputLayout()
{
    If !(hWnd := WinExist("A"))
        return
 
    WinGetClass, Class
 
    if (Class == "ConsoleWindowClass")
    {
        WinGet, consolePID, PID
        DllCall("AttachConsole", Ptr, consolePID)
        VarSetCapacity(buff, 16)
        DllCall("GetConsoleKeyboardLayoutName", Str, buff)
        DllCall("FreeConsole")
        langID := "0x" . SubStr(buff, -3)
    }
    Else
        langID := DllCall("GetKeyboardLayout", Ptr, DllCall("GetWindowThreadProcessId", Ptr, hWnd, UInt, 0, Ptr), Ptr) & 0xFFFF
 
    Size := (DllCall("GetLocaleInfo", UInt, langId, UInt, 0x1001, UInt, 0, UInt, 0) * 2)   ; LOCALE_SENGLANGUAGE := 0x1001
    VarSetCapacity(localeSig, Size, 0)
    DllCall("GetLocaleInfo", UInt, langId, UInt, 0x1001, Str, localeSig, UInt, Size)
    return localeSig
}
 
 
AccObjectFromPoint(ByRef _idChild_ = "", x = "", y = "")
{
   static VT_DISPATCH := 9, h := DllCall("LoadLibrary", Str, "oleacc", Ptr)
   
   (x = "" || y = "") ? DllCall("GetCursorPos", Int64P, pt) : pt := x & 0xFFFFFFFF | y << 32
 
   VarSetCapacity(varChild, 8 + 2*A_PtrSize, 0)
   if   DllCall("oleacc\AccessibleObjectFromPoint", Int64, pt, PtrP, pAcc, Ptr, &varChild) = 0
      Return ComObjEnwrap(VT_DISPATCH, pAcc, 1), _idChild_ := NumGet(varChild, 8, "UInt")
}

 

upsi_daezium пишет:

Последнее, что я нашел и пользуюсь --- langcursor

После того как когда-то пробовал, остались пометки:
- отображает раскладку только возле курсора мыши
- после запуска нет значка ни на панели задач, ни в трее
- после снятия через диспетчер задач в курсоре мыши остается не изменяющийся индикатор с языковой раскладкой, которая была текущей во время прибития.
Что-то изменилось?
 

upsi_daezium пишет:

Жду когда выйдет обещанная новая версия скрипта от Irbis'а, надеюсь автор не забросил свой проект.

Irbis оставлял последнее сообщение почти год назад. Имхо, обновление будет только в случае, если скрипт заинтересует кого-то из сообщества знатоков ahk, но пока этого нет.
Возможно в следующем году создам тему на англоязычном форуме ahk. В нем и пользователей побольше и больше обсуждают ahk, а не русский язык, термины и т.п. (за примером далеко ходить не нужно, достаточно взглянуть на 2-ю страницу этой темы).

78

Re: AHK: Маленький индикатор раскладки в любом участке экрана

monsoon
А какой смысл в скрипте, если он работает только в нотепаде и блокноте?

79

Re: AHK: Маленький индикатор раскладки в любом участке экрана

monsoon, расставьте заглавные буквы и точки.

80

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Sgy-x2 пишет:

А какой смысл в скрипте, если он работает только в нотепаде и блокноте?

Ответ на вопрос есть в теме, если ее почитать.
У меня работает в большинстве приложений, которыми пользуюсь. Если сравнивать с платной amlmaple, то работает в большем количестве приложений и абсолютно стабильно. По скрипту были предложения в некоторых случаях отвязать индикатор от каретки и тогда он стал бы работать везде. У Irbis была идея реализации, но увы...
А с какой версии винды нотепад и блокнот стали разными программами?

81 (изменено: Sgy-x2, 2016-11-11 21:05:36)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

monsoon пишет:

У меня работает в большинстве приложений

У меня в хроме не работает, это надо сказать у меня главное приложение, отвязать? И наверное поместить в правый нижней угол? Смысл отвязывать, если приложение на весь экран?
Увы и ах, но вот-так, жаль конечно что так происходит.
Не думаю что имеет смысл развивать полемику на эту тему.

82 (изменено: monsoon, 2016-11-11 20:53:01)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Когда индикатор вообще никак не отображался в FireFox, для меня это был не повод от него отказаться. Увы и ах, но по-моему, пока нет такой программы, которая бы могла в хроме отобразить индикатор возле каретки. И почему помещать только в правом нижнем углу? Для адресной строки можно под ней, т.к. AhkSpy эту область у хрома определяет. Если индикатор будет выводиться поверх всех окон, то сдвинуть его можно будет в любое место экрана.
Вы, кстати, в курсе, что у вас тоже заглавных букв не хватает?

83

Re: AHK: Маленький индикатор раскладки в любом участке экрана

monsoon пишет:

Вы, кстати, в курсе, что у вас тоже заглавных букв не хватает?

В курсе, это сделано намеренно, дабы придать посылу легкую иронию. Если модераторов не устроит - исправлю, за сим откланиваюсь.

84

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Sgy-x2, поставьте заглавные буквы.

85 (изменено: Ядрён, 2017-04-25 06:07:27)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Доброго времени суток. Вот собрал скрипт индикатор. Он показывает флаги в зависимости от раскладки клавиатуры, первое это индикация раскладки в трее, второе это перемещаемое флаг. Суть такова нужно запомнить последнюю позицию перемещаемого флага, и при следующем запуске скрипта что бы перемещаемый флаг оставался на последней позиции.

#NoEnv
#Persistent
#Singleinstance, force
SetWorkingDir, %A_ScriptDir%/res
SetBatchLines,-1
CoordMode,Mouse,Screen
CoordMode,tooltip,Screen
CoordMode,Caret,Screen
SetKeyDelay, -1, -1
SetWinDelay,20

Gui, +AlwaysOnTop -Caption +ToolWindow +LastFound 
Gui, Add, Picture, x0 y0 w20 h16  vStatic1, Ru1.png  
 Gui, Add, Picture, x0 y0 w20 h16 vStatic2, En1.png   
Gui, Show, x96 y39 h16 w20 NA
;======================== Меню ===================================


Menu, Tray, NoStandard
Menu, Tray, Add, Выход, sub3



hGui:=WinExist()

loop
{
   MouseGetPos,,,mwin
   oldlang:=lang
   lang:=InputLayout()
   if (oldlang!=lang)
   If (lang = "Russian")
   {
    Menu, Tray, Icon, Ru.ico, 1, 1
GuiControl, hide, static2
    GuiControl, Show, static1 

   }
   Else If (lang = "English")
   {
    Menu, Tray, Icon, En.ico, 1, 1
GuiControl, hide, static1
      GuiControl, Show, static2

   }
   Gui, +AlwaysOnTop -Caption +ToolWindow +LastFound
   sleep, 50
}

#if (mwin=hGui)
lbutton::
MoveWin(hGui)
return
#if

MoveWin(hwnd,key="lbutton")
{
  MouseGetPos,oldmmx,oldmmy
  while GetKeyState(key,"P")
  {
    sleep,10
    MouseGetPos,mmx,mmy
    WinGetPos,wx,wy,ww,wh,ahk_id %hwnd%
    wx:=wx+mmx-oldmmx
    wy:=wy+mmy-oldmmy
    WinMove,ahk_id %hwnd%,,%wx%,%wy%
    oldmmx:=mmx
    oldmmy:=mmy
  }
  return
}

InputLayout()
{
    WinGetClass, Class, % "ahk_id" hID := WinExist("A")
    if !id := DllCall("GetWindow", Ptr, hid, UInt, GW_OWNER := 4, Ptr)
      id:=hID
    ThreadID := DllCall("GetWindowThreadProcessId", "Int", id, "Int", 0)
    HKL := DllCall("GetKeyboardLayout", "uint", ThreadID, "UShort")
    VarSetCapacity(sKbd, 260, 0)
    DllCall("GetLocaleInfo", "uint", HKL
                           , "uint", 0x1001
                           , "str",  sKbd
                           , "uint", 260)
    Return sKbd
}

sub3:
  Exitapp


Вот готовый скрипт уже с флагами.

Post's attachments

indicator.zip 3.19 kb, 8 downloads since 2017-04-25 

You don't have the permssions to download the attachments of this post.
OS: Win7x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

86

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Это вопрос?
OnExit; IniWrite или RegWrite на ваш вкус.

87 (изменено: becauseim, 2017-04-25 15:42:04)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Ядрён, иконка должна отображаться только в трее или в т.ч. рядом с курсором? У себя вижу только в трее.
upd.: заметил, что есть еще иконка в произвольном месте. Так понимаю, она нужна в случае, когда панель управления свернута.

Win10x64, AHK v1.1.25

88 (изменено: Ядрён, 2017-04-25 16:25:52)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Вечером выложу полную версию с курсорами, немного работы в программе pain.net и синий курсор русский язык, красный курсор английский язык в текстовом поле флаги.

OS: Win7x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

89

Re: AHK: Маленький индикатор раскладки в любом участке экрана

+ Ядрён, по-хорошему, надо так:

http://www.softportal.com/scr/9341/curlyt-mid-1.png

90 (изменено: Ядрён, 2017-04-25 21:13:49)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Что то никак с не разберусь с этим "IniRead" вроде всё правильно а не работает.

#NoEnv
#Persistent
#Singleinstance, force
SetWorkingDir, %A_ScriptDir%/res
SetBatchLines,-1
CoordMode,Mouse,Screen
CoordMode,tooltip,Screen
CoordMode,Caret,Screen
SetKeyDelay, -1, -1
SetWinDelay,20
   xPoss := xPosit
   yPoss := yPosit

IniRead, xPosit, Position.ini, xdirectory, OSx
IniRead, yPosit, Position.ini, ydirectory, OSy


Gui, +AlwaysOnTop -Caption +ToolWindow +LastFound 
Gui, Add, Picture, x0 y0 w20 h16  vStatic1, Ru1.png  
 Gui, Add, Picture, x0 y0 w20 h16 vStatic2, En1.png   
Gui, Show, %xPoss% %yPoss% h16 w20 NA,lang053
;======================== Меню ===================================
 ; Gui, Show, x96 y39 h16 w20 NA
 

Menu, Tray, NoStandard
Menu, Tray, Add, Выход, sub3



hGui:=WinExist()

loop
{
   MouseGetPos,,,mwin
   oldlang:=lang
   lang:=InputLayout()
   if (oldlang!=lang)
   If (lang = "Russian")
   {
    Menu, Tray, Icon, Ru.ico, 1, 1
GuiControl, hide, static2
    GuiControl, Show, static1 

   }
   Else If (lang = "English")
   {
    Menu, Tray, Icon, En.ico, 1, 1
GuiControl, hide, static1
      GuiControl, Show, static2

   }
   Gui, +AlwaysOnTop -Caption +ToolWindow +LastFound
   sleep, 50
}

#if (mwin=hGui)
lbutton::
MoveWin(hGui)
return
#if

MoveWin(hwnd,key="lbutton")
{
  MouseGetPos,oldmmx,oldmmy
  while GetKeyState(key,"P")
  {
    sleep,10
    MouseGetPos,mmx,mmy
    WinGetPos,wx,wy,ww,wh,ahk_id %hwnd%
    wx:=wx+mmx-oldmmx
    wy:=wy+mmy-oldmmy
    WinMove,ahk_id %hwnd%,,%wx%,%wy%
    oldmmx:=mmx
    oldmmy:=mmy
  }
  return
}

InputLayout()
{
    WinGetClass, Class, % "ahk_id" hID := WinExist("A")
    if !id := DllCall("GetWindow", Ptr, hid, UInt, GW_OWNER := 4, Ptr)
      id:=hID
    ThreadID := DllCall("GetWindowThreadProcessId", "Int", id, "Int", 0)
    HKL := DllCall("GetKeyboardLayout", "uint", ThreadID, "UShort")
    VarSetCapacity(sKbd, 260, 0)
    DllCall("GetLocaleInfo", "uint", HKL
                           , "uint", 0x1001
                           , "str",  sKbd
                           , "uint", 260)
    Return sKbd
}

sub3:
IfWinExist, lang053
{
    WinGetPos, xPosit, yPosit ; Использует окно, найденное выше.
   
}
IniWrite, %xPosit%, Position.ini, xdirectory, OSx
IniWrite, %yPosit%, Position.ini, ydirectory, OSy
sleep, 60
  Exitapp
+ открыть спойлер

Единственный недостаток что перемещаемый флаг нельзя оставить на последней позиции. Точное описание в #85 посту.

Вот как и обещал выкладываю индикатор флага и курсор индикация.
Точное описание в #88 посту.

Post's attachments

indicator+Cur.zip 133.49 kb, 10 downloads since 2017-04-25 

You don't have the permssions to download the attachments of this post.
OS: Win7x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

91 (изменено: Ядрён, 2017-04-25 23:42:34)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Всё разобрался . Забыл подставить "x" "y".

Gui, Show, %xPoss% %yPoss% h16 w20 NA,lang053

Вот готовый код.

 
#NoEnv
#Persistent
#Singleinstance, force
SetWorkingDir, %A_ScriptDir%/res
SetBatchLines,-1
CoordMode,Mouse,Screen
CoordMode,tooltip,Screen
CoordMode,Caret,Screen
SetKeyDelay, -1, -1
SetWinDelay,20
 OCR_IBEAM := 32513, OCR_NORMAL := 32512, OCR_APPSTARTING := 32650,OCR_HAND := 32649,OCR_WAIT := 32514
SetTimer, LocaleWatch, 100

   IniRead, xxxx, Position.ini, xdirectory, xxxx
   IniRead, yyyy, Position.ini, ydirectory, yyyy

Gui, +AlwaysOnTop -Caption +ToolWindow +LastFound 
Gui, Add, Picture, x0 y0 w20 h16  vStatic1, Ru1.png  
 Gui, Add, Picture, x0 y0 w20 h16 vStatic2, En1.png   
Gui, Show, x%xxxx% y%yyyy% h16 w20 NA,lang053

 Menu, Tray, NoStandard
Menu, Tray, Add, Выход, sub3

hGui:=WinExist()

loop
{

   MouseGetPos,,,mwin
   oldlang:=lang
   lang:=InputLayout()
   if (oldlang!=lang)
   If (lang = "Russian")
   {
    Menu, Tray, Icon, Ru.ico, 1, 1
GuiControl, hide, static2
    GuiControl, Show, static1 

   }
   Else If (lang = "English")
   {
    Menu, Tray, Icon, En.ico, 1, 1
GuiControl, hide, static1
      GuiControl, Show, static2

   }
   Gui, +AlwaysOnTop -Caption +ToolWindow +LastFound
   sleep, 50
}

#if (mwin=hGui)
lbutton::
MoveWin(hGui)
return
#if

MoveWin(hwnd,key="lbutton")
{
  MouseGetPos,oldmmx,oldmmy
  while GetKeyState(key,"P")
  {
    sleep,10
    MouseGetPos,mmx,mmy
    WinGetPos,wx,wy,ww,wh,ahk_id %hwnd%
    wx:=wx+mmx-oldmmx
    wy:=wy+mmy-oldmmy
    WinMove,ahk_id %hwnd%,,%wx%,%wy%
    oldmmx:=mmx
    oldmmy:=mmy
  }
  return
}

InputLayout()
{
    WinGetClass, Class, % "ahk_id" hID := WinExist("A")
    if !id := DllCall("GetWindow", Ptr, hid, UInt, GW_OWNER := 4, Ptr)
      id:=hID
    ThreadID := DllCall("GetWindowThreadProcessId", "Int", id, "Int", 0)
    HKL := DllCall("GetKeyboardLayout", "uint", ThreadID, "UShort")
    VarSetCapacity(sKbd, 260, 0)
    DllCall("GetLocaleInfo", "uint", HKL
                           , "uint", 0x1001
                           , "str",  sKbd
                           , "uint", 260)
    Return sKbd
}


$sc1D::
If DllCall("GetKeyboardLayout", "Int", DllCall("GetWindowThreadProcessId", "Int", WinExist("A"), "Int", "0"))=0x4190419
{
ControlGetFocus, CtrlFocus, % "ahk_id" WinExist("A")
PostMessage, 0x50, 0, 0x4090409, %CtrlFocus% ;английский
}
else
{
ControlGetFocus, CtrlFocus, % "ahk_id" WinExist("A")
PostMessage, 0x50, 0, 0x4190419, %CtrlFocus% ;русский
}
return


LocaleWatch:

   MouseGetPos,,, WinID
   ThreadID := DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
   InputLocaleID := DllCall("GetKeyboardLayout", UInt, ThreadID)
  if (InputLocaleID = Prev_InputLocaleID)  
Return
 

   bool := (InputLocaleID = 0x4090409)
   hArrow	:= DllCall("LoadCursorFromFile", Str, (bool ? "EN" : "RU") . "_ARROW.ani")
   hIbeam	:= DllCall("LoadCursorFromFile", Str, (bool ? "EN" : "RU") . "_IBEAM.ani")
   hAPPSTARTING	:= DllCall("LoadCursorFromFile", Str, (bool ? "EN" : "RU") . "_APPSTARTING.ani")
   hWAIT	:= DllCall("LoadCursorFromFile", Str, (bool ? "EN" : "RU") . "_WAIT.ani")
   hHAND	:= DllCall("LoadCursorFromFile", Str, (bool ? "EN" : "RU") . "_HAND.ani")

   DllCall("SetSystemCursor", UInt, hArrow, Int,	OCR_NORMAL)
   DllCall("SetSystemCursor", UInt, hIbeam, Int,	OCR_IBEAM)
   DllCall("SetSystemCursor", UInt, hAPPSTARTING, Int,	OCR_APPSTARTING)
   DllCall("SetSystemCursor", UInt, hWAIT, Int,		OCR_WAIT)
   DllCall("SetSystemCursor", UInt, hHAND, Int,		OCR_HAND)

   Prev_InputLocaleID := InputLocaleID
   Return

   hArrow	:= DllCall("LoadCursorFromFile", Str, "GR_ARROW.ani")
   hIbeam	:= DllCall("LoadCursorFromFile", Str, "GR_IBEAM.ani")
   hAPPSTARTING	:= DllCall("LoadCursorFromFile", Str, "GR_APPSTARTING.ani")
   hWAIT	:= DllCall("LoadCursorFromFile", Str, "GR_WAIT.ani")
   hHAND	:= DllCall("LoadCursorFromFile", Str, "GR_HAND.ani")
   DllCall("SetSystemCursor", UInt, hArrow, Int,	OCR_NORMAL)
   DllCall("SetSystemCursor", UInt, hIbeam, Int,	OCR_IBEAM)
   DllCall("SetSystemCursor", UInt, hAPPSTARTING, Int,	OCR_APPSTARTING)
   DllCall("SetSystemCursor", UInt, hWAIT, Int,		OCR_WAIT)
   DllCall("SetSystemCursor", UInt, hHAND, Int,		OCR_HAND)
	Prev_InputLocaleID := 1


sub3:
DllCall("SystemParametersInfo", UInt, "0x57", UInt, 0, UInt, 0, UInt, 0) 
IfWinExist, lang053
{
    WinGetPos, xxxx, yyyy ; Использует окно, найденное выше.
   
}
IniWrite, %xxxx%, Position.ini, xdirectory, xxxx
IniWrite, %yyyy%, Position.ini, ydirectory, yyyy
sleep, 60
  Exitapp

С флагами готовый скрипт здесь.

Post's attachments

ind+cur.zip 133.21 kb, 11 downloads since 2017-04-25 

You don't have the permssions to download the attachments of this post.
OS: Win7x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

92

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Ядрён
Гораздо лучше иметь индикатор у текстового курсора как в Curlyt, чем у мышиного указателя, ибо нет понимания что происходит при вводе текста, а не при движении мыши, тем более когда указатель скрыт.

Нужно отметить, что этот код отдельно от прилагаемых файлов не работает, хотя тот же ini можно было бы создавать автоматически, как это принято. Также код блокирует Ctrl. Удивительно, что такое нельзя было сразу заметить.
Вообще код на публичный не претендует. Мало кому понравится, когда их привычный указатель вдруг превратиться в багряную мигалку, которая после выхода из скрипта может отображаться вплоть до восстановления (через control main.cpl,,1).

93 (изменено: Ядрён, 2017-05-29 23:38:54)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Доброго времени суток. Вот дописал скрипт из примеров выше , получилось замечательно . Индикатор флаг передвигается в любой участок экрана , при выходе сохраняет позицию индикатора, флаг значок в трее . Всё бы было замечательно но в играх блокируются кнопки "Lbutton" и "Rbutton" , и не пойму почему в окнах в программах работают а в играх нет . Подскажите пожалуйста почему так происходит ?

#NoEnv
#Singleinstance, force
SetWorkingDir, %A_ScriptDir%/res
SetBatchLines,-1
CoordMode,Mouse,Screen
CoordMode,tooltip,Screen
CoordMode,Caret,Screen
SetKeyDelay,0
SetWinDelay,20
OnExit, Exit

RegRead, xxxx, HKEY_LOCAL_MACHINE, SOFTWARE\Scriptss, xdirectory
RegRead, yyyy, HKEY_LOCAL_MACHINE, SOFTWARE\Scriptss, ydirectory

if (xxxx="")
{
  xxxx=555
  RegWrite, REG_SZ, HKEY_LOCAL_MACHINE, SOFTWARE\Scriptss, xdirectory, %xxxx%
}
if (yyyy="")
{
  yyyy=111
  RegWrite, REG_SZ, HKEY_LOCAL_MACHINE, SOFTWARE\Scriptss, ydirectory, %yyyy%
}

Gui, +hwndhGui +AlwaysOnTop -Caption +ToolWindow +LastFound 
Gui, Add, Picture, x0 y0 w20 h16  vStatic1, Ru1.png  
 Gui, Add, Picture, x0 y0 w20 h16 vStatic2, En1.png   
Gui, Show, x%xxxx% y%yyyy% h16 w20 NA, lang053



hGui:=WinExist()


loop
{
   MouseGetPos,,,mwin
   oldlang:=lang
   lang:=InputLayout()
   if (oldlang!=lang)
   If (lang = "Russian")
   {
    Menu, Tray, Icon, Ru.ico, 1, 1
GuiControl, hide, static2
    GuiControl, Show, static1 

   }
   Else If (lang = "English")
   {
    Menu, Tray, Icon, En.ico, 1, 1
GuiControl, hide, static1
      GuiControl, Show, static2

   }
   Gui, +hwndhGui +AlwaysOnTop -Caption +ToolWindow +LastFound
   sleep, 50
}



#if (mwin=hGui)

*~$lbutton::
 
MoveWin(hGui)


return



#if

MoveWin(hwnd,key="lbutton")
{
  MouseGetPos,oldmmx,oldmmy
  while GetKeyState(key,"P")

  {
    sleep,10
    MouseGetPos,mmx,mmy
    WinGetPos,wx,wy,ww,wh,ahk_id %hwnd%
    wx:=wx+mmx-oldmmx
    wy:=wy+mmy-oldmmy
    WinMove,ahk_id %hwnd%,,%wx%,%wy%
    oldmmx:=mmx
    oldmmy:=mmy

  }


  return

}

InputLayout()
{
    WinGetClass, Class, % "ahk_id" hID := WinExist("A")
    if !id := DllCall("GetWindow", Ptr, hid, UInt, GW_OWNER := 4, Ptr)
      id:=hID
    ThreadID := DllCall("GetWindowThreadProcessId", "Int", id, "Int", 0)
    HKL := DllCall("GetKeyboardLayout", "uint", ThreadID, "UShort")
    VarSetCapacity(sKbd, 260, 0)
    DllCall("GetLocaleInfo", "uint", HKL
                           , "uint", 0x1001
                           , "str",  sKbd
                           , "uint", 260)
    Return sKbd
}


Exit:
 DllCall("SystemParametersInfo", UInt, "0x57", UInt, 0, UInt, 0, UInt, 0) 
IfWinExist, lang053
{
    WinGetPos, xxxx, yyyy 
   
}

RegWrite, REG_SZ, HKEY_LOCAL_MACHINE, SOFTWARE\Scriptss, xdirectory, %xxxx%
     sleep, 60
RegWrite, REG_SZ, HKEY_LOCAL_MACHINE, SOFTWARE\Scriptss, ydirectory, %yyyy%
         sleep, 60 

  Exitapp

Папка с флагами прилагается ниже.

Post's attachments

res.zip 1.96 kb, 11 downloads since 2017-05-29 

You don't have the permssions to download the attachments of this post.
OS: Win7x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).
+ DD

94

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Ядрён
Для работы вашего скрипта требуются права администратора, т.к. запись в реестр идет в раздел HKLM. Для скриптов имхо лучший выбор - ini-файл.
Не отображается раскладка для консольных программ. В теме есть функция для этого.
В один из запусков флажок перемещался рывками, а потом вообще пропал. Догадался посмотреть в реестре, оказалось, что у xdirectory было значение -30, хотя за пределы экрана флажок ни разу не перемещался.

А вообще это попытка улучшить скрипт с 1-й страницы? Согласен с Flasher, что интереснее варианты с привязкой индикатора к текстовому курсору (каретке). Есть ряд таких программ и скрипт. Общий недостаток - они не отображают индикатор, если из приложения нельзя получить координаты каретки, хотя в этом случае по идее нужно просто определять координаты контрола выше по иерархии и выводить относительно его координат.

95 (изменено: egor95, 2018-07-05 19:46:26)

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Переписал скрипт:

  • добавил третью раскладку клавиатуры (особенно полезно для жителей Украины, Беларуси, Казахстана, ...), выкладываю версии Рус-Eng-Укр и Рус-Eng;

  • в версии Рус-Eng-Укр прописан обратный порядок переключения языка (Eng(1033) -> Укр(1058) -> Рус(1049)), для того чтобы происходил прямой порядок переключения (Eng(1033) -> Рус(1049) -> Укр(1058)), необходимо заменить "PostMessage, 0x50, 2, 1,, A" на "PostMessage, 0x50, 2,,, A";

  • сделал квадратные флаги и закрепил по середине над кареткой, таким образом флаг не будет мешать вводу и редактированию текста;

  • для режима Caps Lock сделал небольшую зеленую рамку и привязал Caps Lock к клику ПКМ по флагу;

  • если скрипт будет использоваться на планшете или ноутбуке с небольшим экраном и масштабом 150%, то выкладываю версии Рус-Eng и Рус-Eng-Укр для масштаба 150%;

  • также отключил отображение в трее, по ненадобности.

В случае, если необходим не украинский, а другой язык третьей раскладкой, необходимо просто заменить флаг (Ua.png) и "Ukrainian" в "If (InputLayout()="Ukrainian")".
Флаги такого же вида, как были использованы в скрипте, можно найти по ссылке: http://www.freeflagicons.com/buy/square … amed_icon/. Также их необходимо уменьшить до размера 16*16 для обычного скрипта, и до размера 24*24 для скрипта 150%.

96

Re: AHK: Маленький индикатор раскладки в любом участке экрана

egor95
У меня сообщение, что архив имеет неизвестный формат.

97

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Господа, а не лучше менять цвета курсора, который активируется во время печати, соответственно — на синий и красный, в зависимости от раскладки? Я как-то это делал. Зачем эти флажки?

98

Re: AHK: Маленький индикатор раскладки в любом участке экрана

DD
Перезалил. Пришлось разделить на два архива, обычные версии прикрепил к своему предыдущему посту, а версии для масштаба 150% к этому.
А на счет флагов, то тут, кому как больше нравиться, плюс при клике по флагу переключается язык.

99

Re: AHK: Маленький индикатор раскладки в любом участке экрана

Обе версии скрипта в Хроме флаг не отображают.

100

Re: AHK: Маленький индикатор раскладки в любом участке экрана

DD
На счет хрома, monsoon уже об этом писал: http://forum.script-coding.com/viewtopi … 84#p109084.
Я пользуюсь Firefox, там все работает.