Изменить курсор мыши на окружающую среду с 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