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
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

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'а, надеюсь автор не забросил свой проект.