1

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

Как сменить курсор на другой системный так, чтобы он не менялся в зависимости от действия и местоположения?  Всё что нашёл на эту тему либо не работает, либо меняет курсор непредсказуемо. То при перетаскивании вдруг меняется, то над полем Edit, то ещё как-то.
  Помогите назначить на нужный курсор(любой, но неизменный), а потом вернуть всё к стандарту.

2 (изменено: Alectric, 2015-05-06 21:09:02)

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

Вот так пользуюсь: (надо посмотреть как загрузить из файла, не помню уже)

IDC_APPSTARTING := DllCall("User32.dll\LoadCursor", "Ptr", NULL, "Int", 32650, "UPtr")
IDC_ARROW := DllCall("User32.dll\LoadCursor", "Ptr", NULL, "Int", 32512, "UPtr")
IDC_CROSS := DllCall("User32.dll\LoadCursor", "Ptr", NULL, "Int", 32515, "UPtr")
IDC_HAND := DllCall("User32.dll\LoadCursor", "Ptr", NULL, "Int", 32649, "UPtr")
IDC_HELP := DllCall("User32.dll\LoadCursor", "Ptr", NULL, "Int", 32651, "UPtr")
IDC_IBEAM := DllCall("User32.dll\LoadCursor", "Ptr", NULL, "Int", 32513, "UPtr")
IDC_ICON := DllCall("User32.dll\LoadCursor", "Ptr", NULL, "Int", 32641, "UPtr")
IDC_NO := DllCall("User32.dll\LoadCursor", "Ptr", NULL, "Int", 32648, "UPtr")
IDC_SIZE := DllCall("User32.dll\LoadCursor", "Ptr", NULL, "Int", 32640, "UPtr")
IDC_SIZEALL := DllCall("User32.dll\LoadCursor", "Ptr", NULL, "Int", 32646, "UPtr")
IDC_SIZENESW := DllCall("User32.dll\LoadCursor", "Ptr", NULL, "Int", 32643, "UPtr")
IDC_SIZENS := DllCall("User32.dll\LoadCursor", "Ptr", NULL, "Int", 32645, "UPtr")
IDC_SIZENWSE := DllCall("User32.dll\LoadCursor", "Ptr", NULL, "Int", 32642, "UPtr")
IDC_SIZEWE := DllCall("User32.dll\LoadCursor", "Ptr", NULL, "Int", 32644, "UPtr")
IDC_UPARROW := DllCall("User32.dll\LoadCursor", "Ptr", NULL, "Int", 32516, "UPtr")
IDC_WAIT := DllCall("User32.dll\LoadCursor", "Ptr", NULL, "Int", 32514, "UPtr")


  DllCall("SetSystemCursor",Ptr,IDC_SIZEALL,Int,32512) ; установить курсор на загруженный в переменную "IDC_SIZEALL"

  DllCall("SystemParametersInfo",UInt,0x57,UInt,0,UInt,0,UInt,0) ; вернуть по умолчанию.

Вот с DLL'ки (источник):

hModule := DllCall("LoadLibrary", str, "dllName.dll") ; load dll into memory
DllCall("User32.dll\LoadCursor", UPtr, hModule, Str, "CursorName") ; call loadcursor passing the result from DllMain.. 
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

3 (изменено: Foma, 2015-05-06 21:29:01)

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

Всё равно, если он над блокнотом или над текстом в броузере, он меняется на стандартный, если тянешь окно за бок - тоже.

4 (изменено: teadrinker, 2015-05-07 02:02:46)

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

ReplaceSystemCursors("IDC_NO")
OnExit, Exit
Return

Esc:: ExitApp
Exit:
   ReplaceSystemCursors()
   ExitApp

ReplaceSystemCursors(IDC = "")
{
   static IMAGE_CURSOR := 2, SPI_SETCURSORS := 0x57
        , SysCursors := { IDC_APPSTARTING: 32650
                        , IDC_ARROW: 32512
                        , IDC_CROSS: 32515
                        , IDC_HAND: 32649
                        , IDC_HELP: 32651
                        , IDC_IBEAM: 32513
                        , IDC_NO: 32648
                        , IDC_SIZEALL: 32646
                        , IDC_SIZENESW: 32643
                        , IDC_SIZENWSE: 32642
                        , IDC_SIZEWE: 32644
                        , IDC_SIZENS: 32645 
                        , IDC_UPARROW: 32516
                        , IDC_WAIT: 32514 }
   if !IDC
      DllCall("SystemParametersInfo", UInt, SPI_SETCURSORS, UInt, 0, UInt, 0, UInt, 0)
   else  {
      hCursor := DllCall("LoadCursor", Ptr, 0, UInt, SysCursors[IDC], Ptr)
      for k, v in SysCursors  {
         hCopy := DllCall("CopyImage", Ptr, hCursor, UInt, IMAGE_CURSOR, Int, 0, Int, 0, UInt, 0, Ptr)
         DllCall("SetSystemCursor", Ptr, hCopy, UInt, v)
      }
   }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: Foma, 2015-05-07 01:49:41)

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

Спасибо! Что-то похожее я встречал и не смог приспособить.

6

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

А какой нужен?

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

7 (изменено: Foma, 2015-05-07 01:50:26)

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

Всё, нашёл. Менять нужно первую строку.

8

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

Отредактировал немного. Правильно

hCopy := DllCall("CopyImage", Ptr, hCursor, UInt, IMAGE_CURSOR, Int, 0, Int, 0, UInt, 0, Ptr)

вместо

hCopy := DllCall("CopyImage", Ptr, hCursor, UInt, IMAGE_CURSOR, Int, 0, Int, 0, UInt, 0)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

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

Ещё хотел бы спросить. Перечисленные курсоры есть и одинаковые(однотипные) во всех виндовс? Или где-то может загрузиться принципиально другая картинка, или вообще курсор у пользователя пропадёт?

10

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

Foma, Например у меня на последней версии винды(win10 10074) загружается кастумная иконка нормально. А насчет вин xp,2000 и тд не знаю, но скорей всего тоже должно нормально отобразится.

11

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

Информация о названиях курсоров здесь.

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