Изменить курсор мыши на окружающую среду с AutoIt

Я надеюсь, что это возможно... Я создал программу, использующую AutoIt, которая находится в системном трее. Один из элементов панели задач запускает функцию, которая ждет, когда пользователь щелкнет окно, чтобы получить заголовок окна (это может быть любое окно, не обязательно сделанное из AutoIt. Эта часть работает безупречно.

Я хотел бы, чтобы функция меняла курсор мыши на крест, ожидая щелчка пользователя. Я пытался использовать GUISetCursor(3), но из моего понимания это только меняет курсор для окна GUI AutoIt.

Как я могу изменить курсор мыши для среды пользователя, а не только для окна AutoIt?

2 ответа

Решение

В ответ на комментарий Ричарда и ответ на форумах AutoIt, который связал меня с функцией _WinAPI_SetSystemCursor в AutoIt, я смог заставить это работать.

Я скопировал перекрестный курсор, который я хотел, из%SystemRoot%\Cursors (в частности, я скопировал cross_i.cur), чтобы поместить в исходный каталог моего скрипта.

Затем в функцию, которая выполняет грубые действия программы, я добавил следующие строки:

Func FuncName()
       ;backs up the user's arrow cursor
   Local $hPrev = _WinAPI_CopyCursor(_WinAPI_LoadCursor(0, 32512))

       ;backs up the user's ibeam cursor
   Local $iPrev = _WinAPI_CopyCursor(_WinAPI_LoadCursor(0, 32513)) 

       ;changes the user's arrow cursor
   _WinAPI_SetSystemCursor(_WinAPI_LoadCursorFromFile(@ScriptDir & "\cross.cur"),32512) 
       ;changes the user's ibeam cursor
   _WinAPI_SetSystemCursor(_WinAPI_LoadCursorFromFile(@ScriptDir & "\cross.cur"),32513) 

   ; Do the code you want to execute

       ;restores the user's default cursor
   _WinAPI_SetSystemCursor($hPrev,32512) 
       ;restores the user's ibeam cursor
   _WinAPI_SetSystemCursor($iPrev,32513) 
EndFunc

Это позволило мне выполнить то, что мне было нужно.

Вы можете сделать это так:

#include <Misc.au3>
#include <WindowsConstants.au3>

GetTitleByClick()

Func GetTitleByClick()
    Local $hCursor = GUICreate('', 48, 48, -1, -1, $WS_POPUP, $WS_EX_TOPMOST)
    WinSetTrans($hCursor, '', 10)
    GUISetCursor(3, 1, $hCursor)
    GUISetState(@SW_SHOW, $hCursor)

    ; get title bar position
    Local $pos
    Do
        $pos = MouseGetPos()
        WinMove($hCursor, '', $pos[0]-24, $pos[1]-24)
        Sleep(10)
    Until _IsPressed('01')
    GUIDelete($hCursor)

    ; block mouse
    _MouseTrap($pos[0], $pos[1], $pos[0]+1, $pos[0]+1)

    ; click position - activates the window
    MouseClick('left', $pos[0], $pos[1])

    ; unblock mouse
    _MouseTrap()

    ; get the title of the active window
    Local $sTitle = WinGetTitle('[ACTIVE]')

    Return MsgBox(0, 'TITLE', $sTitle)
EndFunc
Другие вопросы по тегам