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, 4 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, 3 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, 6 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, 8 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).

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%.

Post's attachments

Caret Language Layout.zip 1.06 mb, 3 downloads since 2018-07-05 

You don't have the permssions to download the attachments of this post.

96

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

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

97

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

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

98

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

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

Post's attachments

(150%) Caret Language Layout.zip 1.07 mb, 2 downloads since 2018-07-05 

You don't have the permssions to download the attachments of this post.

99

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

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

100

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

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