1 (изменено: InFlames, 2010-10-31 17:46:57)

Тема: AHK: изменение курсора в зависимости от языка ввода

Скрипт меняет курсор в зависимости от языка ввода. Меняются 2 курсора: основной (Arrow) и выделение (Ibeam).

cursor.rar СКАЧАТЬ
Курсоры и сам скрипт есть в архиве cursor.rar.

#NoEnv
#SingleInstance force
#Persistent
LIST=32512,32513,32514,32515,32516,32642,32643,32644,32645,32646,32648,32649,32650,32651
OCR_IBEAM := 32513, OCR_NORMAL := 32512, OCR_APPSTARTING := 32650
OnExit, Exit

SetWorkingDir, %A_ScriptDir%/cursors
Loop, parse, LIST, CSV
{
    Extension := (A_LoopField=32514 or A_LoopField=32650) ? ".ani" : ".cur"
    If !FileExist(A_LoopField . Extension)
    {
      MsgBox, 48,, Не найден следующий файл:`n%A_LoopField%%Extension%
      ExitApp
    }    
    hCur := DllCall("LoadCursorFromFile", Str, A_LoopField . Extension)
    DllCall("SetSystemCursor", UInt, hCur, Int, A_LoopField)
}

SetWorkingDir, %A_ScriptDir%
If !FileExist("EN_ARROW.cur") || !FileExist("RU_ARROW.cur")
|| !FileExist("EN_IBEAM.cur") || !FileExist("RU_IBEAM.cur")
|| !FileExist("EN_APPSTARTING.ani") || !FileExist("RU_APPSTARTING.ani")
{
    MsgBox, 48,, Нет соответствующих курсоров в папке скрипта!
    ExitApp
}
   
SetTimer, LocaleWatch, 100

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.cur")
   hIbeam := DllCall("LoadCursorFromFile", Str, (bool ? "EN" : "RU") . "_IBEAM.cur")
   hAPPSTARTING := DllCall("LoadCursorFromFile", Str, (bool ? "EN" : "RU") . "_APPSTARTING.ani")
   DllCall("SetSystemCursor", UInt, hArrow, Int, OCR_NORMAL)
   DllCall("SetSystemCursor", UInt, hIbeam, Int, OCR_IBEAM)
   DllCall("SetSystemCursor", UInt, hAPPSTARTING, Int, OCR_APPSTARTING)
   Prev_InputLocaleID := InputLocaleID
   Return
   
Exit:
   DllCall("SystemParametersInfo", UInt, "0x57", UInt, 0, UInt, 0, UInt, 0)
   ExitApp

2

Re: AHK: изменение курсора в зависимости от языка ввода

InFlames пишет:

Их необходимо загрузить: Пуск-Выполнить-control mouse-OK
В открывшемся окне выбрать вкладку указатели. Всего можно загрузить 15 указателей (по крайней мере так на Win7). В архиве все указатели пронумерованы и загружать их необходимо в этом же порядке: первым загружается 1_black_arrow.cur, последним 15_black_link.cur.
После загрузки всех указателей данную схему необходимо сохранить (кнопка "сохранить как" чуть выше)

Ты что! Это же адский труд! Не usability. Поэтому и ответов нету.
Курсор можно загрузить непосредственно из файла без всяких дополнительных действий:

IDC_ARROW := 32512
SPI_SETCURSORS := 0x57

SetWorkingDir, %A_ScriptDir%
hCur := DllCall("LoadCursorFromFile", Str, "windows - cursors\5_black_cross.cur")
DllCall("SetSystemCursor", UInt, hCur, Int, IDC_ARROW)
Return

F11:: DllCall("SystemParametersInfo", UInt, SPI_SETCURSORS, UInt, 0, UInt, 0, UInt, 0)

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

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

3

Re: AHK: изменение курсора в зависимости от языка ввода

Я вообще это как-то так вижу:

   If !FileExist("EN_ARROW.cur") || !FileExist("RU_ARROW.cur")
      || !FileExist("EN_IBEAM.cur") || !FileExist("RU_IBEAM.cur")
   {
      MsgBox, 48,,Нет соответствующих курсоров в папке скрипта!
      ExitApp
   }
   OnExit, Exit
   OCR_IBEAM := 32513, OCR_NORMAL := 32512, SPI_SETCURSORS := 0x57
   SetTimer, LocaleWatch, 100

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.cur")
   hIbeam := DllCall("LoadCursorFromFile", Str, (bool ? "EN" : "RU") . "_IBEAM.cur")
   DllCall("SetSystemCursor", UInt, hArrow, Int, OCR_NORMAL)
   DllCall("SetSystemCursor", UInt, hIbeam, Int, OCR_IBEAM)
   Prev_InputLocaleID := InputLocaleID
   Return

Esc:: ExitApp
Exit:
   DllCall("SystemParametersInfo", UInt, SPI_SETCURSORS, UInt, 0, UInt, 0, UInt, 0)
   ExitApp
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

4

Re: AHK: изменение курсора в зависимости от языка ввода

После тестов заметил, что в моем скрипте бывает через некоторое время курсор "зависает", т.е. не меняется.
Тестирую Ваш код.
В Вашем коде намерено пропущен курсор APPSTARTING?
Я заметил, что этот курсор вообще не меняется в моем коде.
Попробовал добавить курсор APPSTARTING в ваш код, и он все равно не меняется.
Вот полный код скрипта.

 #Persistent
 If !FileExist("EN_ARROW.cur") || !FileExist("RU_ARROW.cur")
      || !FileExist("EN_IBEAM.cur") || !FileExist("RU_IBEAM.cur")
      || !FileExist("EN_APPSTARTING.ani") || !FileExist("RU_APPSTARTING.ani")
   {
      MsgBox, 48,,Нет соответствующих курсоров в папке скрипта!
      ExitApp
   }
   OnExit, Exit
   OCR_IBEAM := 32513, OCR_NORMAL := 32512, OCR_APPSTARTING := 32650, SPI_SETCURSORS := 0x57
   SetTimer, LocaleWatch, 100

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.cur")
   hIbeam := DllCall("LoadCursorFromFile", Str, (bool ? "EN" : "RU") . "_IBEAM.cur")
   hAppStarting := DllCall("LoadCursorFromFile", Str, (bool ? "EN" : "RU") . "_APPSTARTING.ani")
   DllCall("SetSystemCursor", UInt, hArrow, Int, OCR_NORMAL)
   DllCall("SetSystemCursor", UInt, hIbeam, Int, OCR_IBEAM)
   DllCall("SetSystemCursor", UInt, hIbeam, Int, OCR_APPSTARTING)
   Prev_InputLocaleID := InputLocaleID
   Return


Exit:
   DllCall("SystemParametersInfo", UInt, SPI_SETCURSORS, UInt, 0, UInt, 0, UInt, 0)
   ExitApp
Return

SetSystemCursor( Cursor = "", cx = 0, cy = 0 )
{
   BlankCursor := 0, SystemCursor := 0, FileCursor := 0 ; init
   
   SystemCursors = 32512IDC_ARROW,32513IDC_IBEAM,32514IDC_WAIT,32515IDC_CROSS
   ,32516IDC_UPARROW,32640IDC_SIZE,32641IDC_ICON,32642IDC_SIZENWSE
   ,32643IDC_SIZENESW,32644IDC_SIZEWE,32645IDC_SIZENS,32646IDC_SIZEALL
   ,32648IDC_NO,32649IDC_HAND,32650IDC_APPSTARTING,32651IDC_HELP
   
   If Cursor = ; empty, so create blank cursor
   {
      VarSetCapacity( AndMask, 32*4, 0xFF ), VarSetCapacity( XorMask, 32*4, 0 )
      BlankCursor = 1 ; flag for later
   }
   Else If SubStr( Cursor,1,4 ) = "IDC_" ; load system cursor
   {
      Loop, Parse, SystemCursors, `,
      {
         CursorName := SubStr( A_Loopfield, 6, 15 ) ; get the cursor name, no trailing space with substr
         CursorID := SubStr( A_Loopfield, 1, 5 ) ; get the cursor id
         SystemCursor = 1
         If ( CursorName = Cursor )
         {
            CursorHandle := DllCall( "LoadCursor", Uint,0, Int,CursorID )   
            Break               
         }
      }   
      If CursorHandle = ; invalid cursor name given
      {
         Msgbox,, SetCursor, Error: Invalid cursor name
         CursorHandle = Error
      }
   }   
   Else If FileExist( Cursor )
   {
      SplitPath, Cursor,,, Ext ; auto-detect type
      If Ext = ico
         uType := 0x1   
      Else If Ext in cur,ani
         uType := 0x2      
      Else ; invalid file ext
      {
         Msgbox,, SetCursor, Error: Invalid file type
         CursorHandle = Error
      }      
      FileCursor = 1
   }
   Else
   {   
      Msgbox,, SetCursor, Error: Invalid file path or cursor name
      CursorHandle = Error ; raise for later
   }
   If CursorHandle != Error
   {
      Loop, Parse, SystemCursors, `,
      {
         If BlankCursor = 1
         {
            Type = BlankCursor
            %Type%%A_Index% := DllCall( "CreateCursor"
            , Uint,0, Int,0, Int,0, Int,32, Int,32, Uint,&AndMask, Uint,&XorMask )
            CursorHandle := DllCall( "CopyImage", Uint,%Type%%A_Index%, Uint,0x2, Int,0, Int,0, Int,0 )
            DllCall( "SetSystemCursor", Uint,CursorHandle, Int,SubStr( A_Loopfield, 1, 5 ) )
         }         
         Else If SystemCursor = 1
         {
            Type = SystemCursor
            CursorHandle := DllCall( "LoadCursor", Uint,0, Int,CursorID )   
            %Type%%A_Index% := DllCall( "CopyImage"
            , Uint,CursorHandle, Uint,0x2, Int,cx, Int,cy, Uint,0 )      
            CursorHandle := DllCall( "CopyImage", Uint,%Type%%A_Index%, Uint,0x2, Int,0, Int,0, Int,0 )
            DllCall( "SetSystemCursor", Uint,CursorHandle, Int,SubStr( A_Loopfield, 1, 5 ) )
         }
         Else If FileCursor = 1
         {
            Type = FileCursor
            %Type%%A_Index% := DllCall( "LoadImageA"
            , UInt,0, Str,Cursor, UInt,uType, Int,cx, Int,cy, UInt,0x10 )
            DllCall( "SetSystemCursor", Uint,%Type%%A_Index%, Int,SubStr( A_Loopfield, 1, 5 ) )         
         }         
      }
   }   
}

5

Re: AHK: изменение курсора в зависимости от языка ввода

Во-первых, ошибка:

DllCall("SetSystemCursor", UInt, hIbeam, Int, OCR_APPSTARTING)

а нужно

DllCall("SetSystemCursor", UInt, hAPPSTARTING, Int, OCR_APPSTARTING)

Во-вторых, мой вариант — это уже и есть полный код скрипта, никаких функций больше дописывать не надо, т. е. с APPSTARTING'ом будет так:

   If !FileExist("EN_ARROW.cur") || !FileExist("RU_ARROW.cur")
      || !FileExist("EN_IBEAM.cur") || !FileExist("RU_IBEAM.cur")
      || !FileExist("EN_APPSTARTING.ani") || !FileExist("RU_APPSTARTING.ani")
   {
      MsgBox, 48,, Нет соответствующих курсоров в папке скрипта!
      ExitApp
   }
   OnExit, Exit
   OCR_IBEAM := 32513, OCR_NORMAL := 32512, OCR_APPSTARTING := 32650, SPI_SETCURSORS := 0x57
   SetTimer, LocaleWatch, 100

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.cur")
   hIbeam := DllCall("LoadCursorFromFile", Str, (bool ? "EN" : "RU") . "_IBEAM.cur")
   hAPPSTARTING := DllCall("LoadCursorFromFile", Str, (bool ? "EN" : "RU") . "_APPSTARTING.ani")
   DllCall("SetSystemCursor", UInt, hArrow, Int, OCR_NORMAL)
   DllCall("SetSystemCursor", UInt, hIbeam, Int, OCR_IBEAM)
   DllCall("SetSystemCursor", UInt, hAPPSTARTING, Int, OCR_APPSTARTING)
   Prev_InputLocaleID := InputLocaleID
   Return

Esc:: ExitApp
Exit:
   DllCall("SystemParametersInfo", UInt, SPI_SETCURSORS, UInt, 0, UInt, 0, UInt, 0)
   ExitApp
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

6

Re: AHK: изменение курсора в зависимости от языка ввода

Спасибо, разобрался. Обновил первый пост. Благодарю за пояснения.

7

Re: AHK: изменение курсора в зависимости от языка ввода

Версия, не требующая файлов курсоров. Этот скрипт уже содержит их в себе в виде hex данных.
Не выкладываю код, т.к. он слишком длинный.

скачать cursors(hex).ahk

8 (изменено: Dns, 2010-11-05 10:00:58)

Re: AHK: изменение курсора в зависимости от языка ввода

А можно сделать чтобы курсор был обычным, оставить только отображение флажков при вводе? Ещё заметил у Вас изменена анимация ожидания, знаете в Опере на экспресс панели если выбрать любое окошко и нажать обновить внизу слева будет анимашка. Не знаете как изменить на такую или подобную?

9 (изменено: InFlames, 2010-11-05 10:48:04)

Re: AHK: изменение курсора в зависимости от языка ввода

Смотря какие для вас курсоры обычные.
Заходите в папку C:\Windows\Cursors
Там ищите свои обычные курсоры, к которым должен быть пририсован флаг. Копируете эти курсоры в отдельную папку.
Из первого поста скачиваете архив с курсорами. Вам нужны будут:
EN_ARROW.cur, RU_ARROW.cur, EN_IBEAM.cur, RU_IBEAM.cur, EN_APPSTARTING.ani, RU_APPSTARTING.ani
Устанавливаете программу ArtCursors. С помощью нее редактируете свои обычные курсоры, вставляя туда флаги (Можно копировать из моих курсоров в обычные, как в фотошопе или пеинте).
После редактирования своих обычных курсоров, называете их EN_ARROW.cur, RU_ARROW.cur, EN_IBEAM.cur, RU_IBEAM.cur, EN_APPSTARTING.ani, RU_APPSTARTING.ani. Думаю разберетесь где какой, по аналогии. И кладете их рядом со скриптом.

#NoEnv
#SingleInstance force
#Persistent
LIST=32512,32513,32514,32515,32516,32642,32643,32644,32645,32646,32648,32649,32650,32651
OCR_IBEAM := 32513, OCR_NORMAL := 32512, OCR_APPSTARTING := 32650
OnExit, Exit

SetWorkingDir, %A_ScriptDir%
If !FileExist("EN_ARROW.cur") || !FileExist("RU_ARROW.cur")
|| !FileExist("EN_IBEAM.cur") || !FileExist("RU_IBEAM.cur")
|| !FileExist("EN_APPSTARTING.ani") || !FileExist("RU_APPSTARTING.ani")
{
    MsgBox, 48,, Нет соответствующих курсоров в папке скрипта!
    ExitApp
}
   
SetTimer, LocaleWatch, 100

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.cur")
   hIbeam := DllCall("LoadCursorFromFile", Str, (bool ? "EN" : "RU") . "_IBEAM.cur")
   hAPPSTARTING := DllCall("LoadCursorFromFile", Str, (bool ? "EN" : "RU") . "_APPSTARTING.ani")
   DllCall("SetSystemCursor", UInt, hArrow, Int, OCR_NORMAL)
   DllCall("SetSystemCursor", UInt, hIbeam, Int, OCR_IBEAM)
   DllCall("SetSystemCursor", UInt, hAPPSTARTING, Int, OCR_APPSTARTING)
   Prev_InputLocaleID := InputLocaleID
   Return
   
Exit:
   DllCall("SystemParametersInfo", UInt, "0x57", UInt, 0, UInt, 0, UInt, 0)
   ExitApp

10

Re: AHK: изменение курсора в зависимости от языка ввода

Dns пишет:

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

Насколько я понял, Dns просто хочет, чтобы менялся только один курсор — "IBEAM" — вертикальная палочка, отображаемая при вводе текста, а курсор "ARROW" — стрелочка — оставался прежним.

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

11 (изменено: InFlames, 2010-11-05 11:57:57)

Re: AHK: изменение курсора в зависимости от языка ввода

Если нужны все стандартные курсоры, и Ibeam курсор с флагом, то из первого поста из архива берете 2 курсора EN_IBEAM.cur и RU_IBEAM.cur и кидаете их рядом со следующим скриптом.
Опять же, если нужны только флажки на этих курсорах, то самостоятельно редактируете их в программе artcursors.

#NoEnv
#SingleInstance force
#Persistent

OCR_IBEAM := 32513
OnExit, Exit

SetWorkingDir, %A_ScriptDir%
If !FileExist("EN_IBEAM.cur") || !FileExist("RU_IBEAM.cur")
{
    MsgBox, 48,, Нет соответствующих курсоров в папке скрипта!
    ExitApp
}
   
SetTimer, LocaleWatch, 100

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

   bool := (InputLocaleID = 0x4090409)
   hIbeam := DllCall("LoadCursorFromFile", Str, (bool ? "EN" : "RU") . "_IBEAM.cur")
   DllCall("SetSystemCursor", UInt, hIbeam, Int, OCR_IBEAM)
   Prev_InputLocaleID := InputLocaleID
   Return
   
Exit:
   DllCall("SystemParametersInfo", UInt, "0x57", UInt, 0, UInt, 0, UInt, 0)
   ExitApp

12 (изменено: Dns, 2010-11-05 17:20:46)

Re: AHK: изменение курсора в зависимости от языка ввода

Спасибо, немного подредактировал иконки и всё отлично работает. Только вот такую http://ipicture.ru/uploads/101105/LxGHfDroe3.pngанимацию не могу найти.

13

Re: AHK: изменение курсора в зависимости от языка ввода

C:\Program Files\Opera\Skin\standard_skin.zip
В этомархиве есть файл anims/reload.gif
Вроде то,что надо. Отаетсяперевести его в формат .ani

14

Re: AHK: изменение курсора в зависимости от языка ввода

Это умеет делать бесплатная программа Imagine (которая, кстати сказать, единственная известная мне, имеет лицензию для работы не только для дома, для семьи, но и в корпоративной среде), даже не пришлось фон «ручками» чистить: Архив с курсором.

15

Re: AHK: изменение курсора в зависимости от языка ввода

Спасибо InFlames, alexii Вот что получилось, поставить только не получается) http://ipicture.ru/uploads/101106/3eVQMLVNWT.gif не знаю откуда мусор появился, но на .ani его нет. Если интересно вот сам курсор.

16

Re: AHK: изменение курсора в зависимости от языка ввода

Здорово получилось. Использую в других скриптах.

17

Re: AHK: изменение курсора в зависимости от языка ввода

Это скрипт работает только для Windows 7 или на XP такое тоже возможно?

18

Re: AHK: изменение курсора в зависимости от языка ввода

На любой версии Windows работает.

19

Re: AHK: изменение курсора в зависимости от языка ввода

Вопрос, а возможно ли сделать так что бы курсор менялся и в определенных программах, скажем я часто работаю в Corel Draw X4.

20

Re: AHK: изменение курсора в зависимости от языка ввода

Между строками

LocaleWatch:
   MouseGetPos,,, WinID

вписать код

If winactive("тут вписать название окна корела")
{
   DllCall("SystemParametersInfo", UInt, "0x57", UInt, 0, UInt, 0, UInt, 0) ; возвпащаем обычные курсоры
   return
}

Если требуется наоборот, загружать курсоры для корела, то так

If !winactive("тут вписать название окна корела")
{
   DllCall("SystemParametersInfo", UInt, "0x57", UInt, 0, UInt, 0, UInt, 0) ; возвпащаем обычные курсоры
   return
}

21

Re: AHK: изменение курсора в зависимости от языка ввода

0meg@ пишет:

Вопрос, а возможно ли сделать так что бы курсор менялся и в определенных программах, скажем я часто работаю в Corel Draw X4.

А каким образом и при каких условиях он должен меняться?

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

22

Re: AHK: изменение курсора в зависимости от языка ввода

teadrinker Работая в окне Corel'а курсоры меняються на стандартные системные, и скажем при вводе текста все остаеться так же как и было до скрипта.

23 (изменено: InFlames, 2010-11-14 10:48:33)

Re: AHK: изменение курсора в зависимости от языка ввода

Попробуй так
ahk_class MozillaUIWindowClass заменишь на окно корела

#NoEnv
#SingleInstance force
#Persistent
LIST=32512,32513,32514,32515,32516,32642,32643,32644,32645,32646,32648,32649,32650,32651
OCR_IBEAM := 32513, OCR_NORMAL := 32512, OCR_APPSTARTING := 32650
OnExit, Exit

SetWorkingDir, %A_ScriptDir%/cursors
Loop, parse, LIST, CSV
{
    Extension := (A_LoopField=32514 or A_LoopField=32650) ? ".ani" : ".cur"
    If !FileExist(A_LoopField . Extension)
    {
      MsgBox, 48,, Не найден следующий файл:`n%A_LoopField%%Extension%
      ExitApp
    }    
    hCur := DllCall("LoadCursorFromFile", Str, A_LoopField . Extension)
    DllCall("SetSystemCursor", UInt, hCur, Int, A_LoopField)
}

SetWorkingDir, %A_ScriptDir%
If !FileExist("EN_ARROW.cur") || !FileExist("RU_ARROW.cur")
|| !FileExist("EN_IBEAM.cur") || !FileExist("RU_IBEAM.cur")
|| !FileExist("EN_APPSTARTING.ani") || !FileExist("RU_APPSTARTING.ani")
{
    MsgBox, 48,, Нет соответствующих курсоров в папке скрипта!
    ExitApp
}
   
SetTimer, LocaleWatch, 100

LocaleWatch:
If winactive("ahk_class MozillaUIWindowClass")
{
   DllCall("SystemParametersInfo", UInt, "0x57", UInt, 0, UInt, 0, UInt, 0) ; возвпащаем обычные курсоры
   window=corel
   return
}
   MouseGetPos,,, WinID
   ThreadID := DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
   InputLocaleID := DllCall("GetKeyboardLayout", UInt, ThreadID)
   if (InputLocaleID = Prev_InputLocaleID) and (window = "other")
      Return

   bool := (InputLocaleID = 0x4090409)
   hArrow := DllCall("LoadCursorFromFile", Str, (bool ? "EN" : "RU") . "_ARROW.cur")
   hIbeam := DllCall("LoadCursorFromFile", Str, (bool ? "EN" : "RU") . "_IBEAM.cur")
   hAPPSTARTING := DllCall("LoadCursorFromFile", Str, (bool ? "EN" : "RU") . "_APPSTARTING.ani")
   DllCall("SetSystemCursor", UInt, hArrow, Int, OCR_NORMAL)
   DllCall("SetSystemCursor", UInt, hIbeam, Int, OCR_IBEAM)
   DllCall("SetSystemCursor", UInt, hAPPSTARTING, Int, OCR_APPSTARTING)
   Prev_InputLocaleID := InputLocaleID
   window=other
   Return
   
Exit:
   DllCall("SystemParametersInfo", UInt, "0x57", UInt, 0, UInt, 0, UInt, 0)
   ExitApp

24

Re: AHK: изменение курсора в зависимости от языка ввода

А как упаковать (добавить) курсоры и прописать третий язык? Файлы прилагаю.
Кроме того интересует почему (модификация под Корел) при попадании курсора в область самого графического файла, курсоры опять становяться другими. Я так понимаю из за того что внутри программы и внутри файла курсоры разные (ну инструменты для рисования там). Можно ли так изменить скрипт что бы он работал имено внутри рабочей области графического файла, потому что имено в этом нашел полезность скрипта для себя и других дизайнеров.

Скачать с LetitFile.com
Подумал может класс окна выяснить и прописать, но так тоже не работает.
http://imagepost.ru/thumbs/299/WinInfo.JPG

25

Re: AHK: изменение курсора в зависимости от языка ввода

Можете перевыложить cursor.rar, а то по ссылке нельзя скачать.