1 (изменено: Странникх, 2014-07-25 13:45:52)

Тема: AHK: GUI смена курсора

В приложениях, где я использую AHK свои курсоры. Когда я навожу на картинку, которая расположена поверх окон этих приложений, то курсор меняется на тот, что загружен в Windows (стандартный) и обратно не возвращается если использовать приложение.
Все приложения в оконном режиме.

Собственно, вот код GUI на которую иногда наводится курсор и меняется

Gui, +AlwaysOnTop -0xC00000 +E0x08000000
Gui, Margin, 0, 0
Gui, Add, Picture,, pic.jpg
Gui, Show, NA x0 y0, NamePic

Вопрос, что сделать с GUI, чтобы он не менял курсор на стандартный?

2

Re: AHK: GUI смена курсора

Может программа сама какая-то недоработанная? Есть снимок экрана, желательно с курсором?

3

Re: AHK: GUI смена курсора

В приложениях, где я использую AHK свои курсоры.

Так может быть в вопросе надо привести код того как используете курсор?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

4

Re: AHK: GUI смена курсора

Я думаю, Странникх как бы забыл поставить запятую. А имелось в виду: "В приложениях - свои курсоры". То есть сторонние приложения.

5 (изменено: serzh82saratov, 2014-07-25 19:15:43)

Re: AHK: GUI смена курсора

Ну если так, то:


Gui, +AlwaysOnTop -Caption +E0x08000020 +Lastfound
Gui, Margin, 0, 0
Gui, Add, Picture,, D:\Images\Newtons_cradle_animation_book_2.gif
Gui, Show, NA x0 y0, NamePic 
WinSet, Transparent, 250
Return

и обратно не возвращается если использовать приложение.

Вот почему обратно не возвращается, это конечно загадка, ни разу такого не видел.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

6 (изменено: Странникх, 2014-07-25 19:50:15)

Re: AHK: GUI смена курсора

serzh82saratov пишет:

Ну если так, то:


Gui, +AlwaysOnTop -Caption +E0x08000020 +Lastfound
Gui, Margin, 0, 0
Gui, Add, Picture,, D:\Images\Newtons_cradle_animation_book_2.gif
Gui, Show, NA x0 y0, NamePic 
WinSet, Transparent, 250
Return

и обратно не возвращается если использовать приложение.

Вот почему обратно не возвращается, это конечно загадка, ни разу такого не видел.

Обратно возвращается если взаимодействовать с чем-нибудь в приложении, когда меняется курсор (подсвечивается при наведении на кнопку например).

WinSet, Transparent, 250

Опять таки возвращаясь к падению FPS'а.. эта команда его снижает, как я писал уже ранее. Проблему она в целом решает, но создает другую. Есть другое решение?

Я думаю, Странникх как бы забыл поставить запятую. А имелось в виду: "В приложениях - свои курсоры". То есть сторонние приложения.

Совершенно верно.

7

Re: AHK: GUI смена курсора

Странникх пишет:

Обратно возвращается если взаимодействовать с чем-нибудь в приложении, когда меняется курсор (подсвечивается при наведении на кнопку например).

Подтверждается предположение, что сама программа несовершенна. Она изменяет курсор по событию в собственном окне, а смену окна под курсором не учитывает.

8

Re: AHK: GUI смена курсора

Да, Вы правы. Может тогда в AHK задать в цикл сменять курсор в таких-то координатах, в которых расположено GUI?

Или нет, даже лучше - сделать так:
Когда запущен скрипт курсор в Windows со стандартного меняется на тот, что мне нужен. А по закрытию (выхода) скрипта или неактивном окне программы менять его на предыдущий - стандартный.
Такое можно сделать?

9

Re: AHK: GUI смена курсора

Я же говорю: нужен снимок экрана с курсором. Сначала нужно понять, откуда берёт курсор программа. Затем написать скрипт, который периодически проверяет. Если активно окно программы, и при этом указатель мыши находится над окном AutoHotkey GUI, то заменить курсор на ...

10

Re: AHK: GUI смена курсора

Такое можно сделать?


space::
   SetSystemCursor("IDC_WAIT",32,32)
   KeyWait, Space
   RestoreCursors() 
Return 
 
SetSystemCursor( Cursor = "", cx = 64, cy = 64 )
{
   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 ) )         
         }         
      }
   }   
}
RestoreCursors()
{
   SPI_SETCURSORS := 0x57
   DllCall( "SystemParametersInfo", UInt,SPI_SETCURSORS, UInt,0, UInt,0, UInt,0 )
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11

Re: AHK: GUI смена курсора

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

Курсоры, которые сейчас стоят по схеме? Номер, стоящий перед IDC - это ID курсора? Где его брать?

12

Re: AHK: GUI смена курсора

Странникх пишет:

Курсоры, которые сейчас стоят по схеме? Номер, стоящий перед IDC - это ID курсора? Где его брать?

Предлагаю воспользоваться поиском. "Всё уже придумано до нас".
АНК: Как узнать текущий курсор?
AHK: Изменение текущего курсора
AHK: Замена системного курсора изображением хранящимся в виде Hex
AHK: изменение курсора в зависимости от языка ввода

13

Re: AHK: GUI смена курсора

ypppu, спасибо большое. Замена системного курсора изображением хранящимся в виде Hex помогло.
serzh82saratov, тоже подходит, но вкуривал очень долго. Ваши коды крайне тяжело понять без абсолютных знаний AHK.

14

Re: AHK: GUI смена курсора

Это не моё. http://www.autohotkey.com/board/topic/3 … sor/page-4

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui