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 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

5

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

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

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

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

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

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

Win 7 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 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

9

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

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

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

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

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

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

11

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

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

12

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

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

13

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

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

Win 7 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") и другие поинтеры

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