Автор Тема: Скрытие курсора мыши на всем экране  (Прочитано 6525 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн GreyWerewolf [?]

  • Прохожий
  • Новичок
  • *
  • Сообщений: 23
  • Репутация: 0
  • Пол: Мужской
  • То тут, то там...
    • Награды
  • Версия AutoIt: 3.3.14.0
Была необходимость скрыть курсор мыши, а с файлами курсоров возиться не хотелось. Кроме того - если наша программа изменит курсор Windows, то при каком либо непредвиденном вылете нашей программы курсор обратно не восстановится сам.

Появилась идея перекрыть окном весь рабочий стол. В целом для моих целей такой вариант вполне подошел. К сожалению, в таком варианте перетаскивание мышью работать не будет, а если его включить, то на время перетаскивания курсор вылезет наверх.

(нажмите для показа/скрытия)

Внимание! Пример требует наличия MouseOnEvent!
Собственно сам код:

Код: AutoIt [Выделить]
#include "MouseOnEvent.au3"
#include <WinAPI.au3>

Global $WidthX=(WinGetPos('Program Manager'))[2];разрешение экрана в сумме
Global $hParenttt = GUICreate('', $WidthX, @DesktopHeight, 0, 0);родитель чтобы не было иконки снизу

$hSquare_GUI = GUICreate("", 10, 10,0,0,$WS_POPUPWINDOW, BitOR($WS_EX_LAYERED,$ws_ex_transparent,$WS_EX_TOPMOST),$hParenttt);прорисовка замены курсора
GUISetBkColor(0x0000FF,$hSquare_GUI)
WinSetTrans($hSquare_GUI, '', 100)
GUISetState(@SW_SHOWNA, $hSquare_GUI)

global $hCross_GUI = GUICreate("", $WidthX, @DesktopHeight - 20, 0, 0, 2147483648, 8,$hParenttt);перекрывающее окно
WinSetTrans($hCross_GUI, "", 1)
GUISetState(@SW_SHOWNA, $hCross_GUI)
GUISetCursor(16, 1, $hCross_GUI)

_mousesetonevent($MOUSE_PRIMARYDOWN_EVENT,"_mouseclickdown",$hCross_GUI,1);хоткей на поднятие левой кнопки
HotKeySet("{Esc}","_Exit");выход по Esc

Example()

func Example()
while 1
    sleep(30)
    WinMove($hSquare_GUI, "", MouseGetPos(0), MouseGetPos(1));двигаем замену курсора
WEnd
EndFunc

func _mouseclickdown()
    GUIDelete($hCross_GUI);удаляем прозрачное окно, скрывающее курсор
 if (WinGetState($hCross_GUI)=0) then
            MouseClick("left");кликаем мышей
            $hCross_GUI = GUICreate("", $WidthX, @DesktopHeight - 20, 0, 0,  2147483648, 8,$hParenttt);снова создаем окно для перекрытия курсора
            GUISetCursor(16, 1, $hCross_GUI)
            GUISetState(@SW_SHOWNA, $hCross_GUI)
            WinSetTrans($hCross_GUI, "", 1)
            _mousesetonevent($MOUSE_PRIMARYDOWN_EVENT,"_mouseclickdown",$hCross_GUI);назначаем новому окну горячую клавишу
 EndIf
EndFunc

Func _Exit()
exit
EndFunc


Бывает ошибка программы при нажатии Esc на выходе. Проблема в библиотеке MouseOnEvent.au3.
« Последнее редактирование: Сентябрь 15, 2015, 14:19:20 от GreyWerewolf »

Русское сообщество AutoIt

Скрытие курсора мыши на всем экране
« Отправлен: Сентябрь 15, 2015, 13:37:07 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7814
  • Репутация: 2282
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Скрытие курсора мыши на всем экране
« Ответ #1, Отправлен: Сентябрь 15, 2015, 14:45:20 »
Мой вариант:

Код: AutoIt [Выделить]
#include <WindowsConstants.au3>

$hShow = _CursorShow()
ToolTip('Cursor hidden for 3 seconds...')
Sleep(3000)
_CursorHide($hShow)

Func _CursorShow()
    Local $aRet[2] = [WinGetHandle('[ACTIVE]'), GUICreate('test', @DesktopWidth, @DesktopHeight + 50, -1, -1, -1, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST))]
   
    GUIRegisterMsg($WM_ACTIVATE, 'WM_ACTIVATE')
    GUISetCursor(16, 1, $aRet[1])
    WinSetTrans($aRet[1], '', 1)
    GUISetState(@SW_SHOWNOACTIVATE, $aRet[1])
   
    Return $aRet
EndFunc

Func _CursorHide($hShow)
    GUIRegisterMsg($WM_ACTIVATE, '')
    Return GUIDelete($hShow[1])
EndFunc

Func WM_ACTIVATE($hWnd, $iMsg, $wParam, $lParam)
    If BitAND($wParam, 0xFFFF) > 0 And $lParam <> $hShow[1] Then
        WinActivate($hShow[0])
    EndIf
EndFunc



Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Оффлайн GreyWerewolf [?]

  • Прохожий
  • Новичок
  • *
  • Сообщений: 23

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
  • То тут, то там...
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Скрытие курсора мыши на всем экране
« Ответ #2, Отправлен: Сентябрь 15, 2015, 14:50:44 »
Мой вариант:

Дело не в том, чтобы просто скрыть указатель, это делается еще проще - выносом мыши за экран) Или еще есть функция
Код: AutoIt [Выделить]
В Вашем примере нельзя осуществить щелчок или ввод текста, когда указателя не видно. (ну ввод можно Alt+tab-ом)
« Последнее редактирование: Сентябрь 15, 2015, 15:32:18 от GreyWerewolf »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7814
  • Репутация: 2282
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Скрытие курсора мыши на всем экране
« Ответ #3, Отправлен: Сентябрь 15, 2015, 15:26:00 »
Или так:

Код: AutoIt [Выделить]
#include <WinAPIRes.au3>

_SysCursor_Show(False)

Sleep(3000)

_SysCursor_Show(True)

Func _SysCursor_Show($bShow)
    Local Static $bRet = -1
   
    If $bShow == $bRet Then
        Return SetError(1, 0, 0)
    EndIf
   
    $bRet = $bShow
   
    Local Static $aOCR_Curs[] = _
        [ _
            $OCR_NORMAL, $OCR_IBEAM, $OCR_WAIT, $OCR_CROSS, $OCR_UP, $OCR_SIZE, $OCR_ICON, $OCR_SIZENWSE, _
            $OCR_SIZENESW, $OCR_SIZEWE, $OCR_SIZENS, $OCR_SIZEALL, $OCR_ICOCUR, $OCR_NO, $OCR_HAND, $OCR_APPSTARTING, $OCR_HELP _
        ]
   
    Local Static $ahOld_Curs[UBound($aOCR_Curs)]
    Local Static $ahEmpty_Curs[UBound($aOCR_Curs)]
   
    Local $hBitmap[2] = [_WinAPI_CreateBitmap(1, 1, 1, 16), _WinAPI_InvertANDBitmap(_WinAPI_CreateBitmap(1, 1, 1, 1), 1)]
    Local $hEmpty_Cursor = _WinAPI_CreateIconIndirect($hBitmap[0], $hBitmap[1], 0, 0, 0)
   
    _WinAPI_DeleteObject($hBitmap[0])
    _WinAPI_DeleteObject($hBitmap[1])
   
    For $i = 0 To UBound($aOCR_Curs) - 1
        If $bShow Then
            If $ahOld_Curs[$i] And $ahEmpty_Curs[$i] Then
                _WinAPI_SetSystemCursor($ahOld_Curs[$i], $aOCR_Curs[$i])
                _WinAPI_DestroyCursor($ahOld_Curs[$i])
                _WinAPI_DestroyCursor($ahEmpty_Curs[$i])
               
                $ahOld_Curs[$i] = 0
                $ahEmpty_Curs[$i] = 0
            EndIf
        Else
            If $ahOld_Curs[$i] = 0 And $ahEmpty_Curs[$i] = 0 Then
                $ahOld_Curs[$i] = _WinAPI_CopyCursor(_WinAPI_LoadCursor(0, $aOCR_Curs[$i]))
                $ahEmpty_Curs[$i] = _WinAPI_CopyCursor($hEmpty_Cursor)
                _WinAPI_SetSystemCursor($ahEmpty_Curs[$i], $aOCR_Curs[$i])
            EndIf
        EndIf
    Next
   
    _WinAPI_DestroyCursor($hEmpty_Cursor)
EndFunc


но это чревато тем, что при падений скрипта, все ваши системные курсоры будут невидимыми :laugh:.
« Последнее редактирование: Сентябрь 15, 2015, 15:44:51 от CreatoR »

Русское сообщество AutoIt

Re: Скрытие курсора мыши на всем экране
« Ответ #3 Отправлен: Сентябрь 15, 2015, 15:26:00 »

Оффлайн GreyWerewolf [?]

  • Прохожий
  • Новичок
  • *
  • Сообщений: 23

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
  • То тут, то там...
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Скрытие курсора мыши на всем экране
« Ответ #4, Отправлен: Сентябрь 15, 2015, 15:28:09 »
но это чревато тем, что при падений скрипта, все ваши системные курсоры будут невидимыми :laugh:.

О чем я и упоминал в первом сообщении.  :rofl:

Странно что нет легкого способа убрать курсор отовсюду. Даже на иностранных форумах все решения - замена файла курсора на время работы скрипта.  :think:

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2694
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Скрытие курсора мыши на всем экране
« Ответ #5, Отправлен: Сентябрь 16, 2015, 09:15:40 »
См. функцию _WinAPI_SetSystemCursor(). А сам "пустой" курсор можно либо приложить в виде файла, либо нарисовать с помощью GDI.

P.S

CreatoR, похоже, именно так и сделал.


Думай, прежде чем говорить.

Оффлайн GreyWerewolf [?]

  • Прохожий
  • Новичок
  • *
  • Сообщений: 23

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
  • То тут, то там...
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Скрытие курсора мыши на всем экране
« Ответ #6, Отправлен: Сентябрь 16, 2015, 11:20:20 »
См. функцию _WinAPI_SetSystemCursor(). А сам "пустой" курсор можно либо приложить в виде файла, либо нарисовать с помощью GDI.
CreatoR, похоже, именно так и сделал.

Данный подход вполне возможен, и в основном, только он и описан на иностранных форумах. Но он опасен по причине сбоя скрипта. Если скрипт не выполнится до конца по какой-либо причине, то пользователь будет иметь проблемы с курсором. О чем CreatoR в своём и я в первом посте и написали.  :-X

И, к слову, у CreatoR'а очень элегантное решение, т.к. курсор отдельно заливать с программой не требуется.

Оффлайн VadimKHL [?]

  • Новичок
  • *
  • Сообщений: 89
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Скрытие курсора мыши на всем экране
« Ответ #7, Отправлен: Октябрь 12, 2017, 21:16:10 »
Добрый день! Проблема в том, что имею устройство на основе Win7 и тачскрин монитора.
Отображение курсора там совсем не нужно.
Очень хорошо подходит данный пример.
CreatoR, если скрыть курсор данным способом, не возвращая его после,
что произойдет при перезагрузки Windows?

Возможно ли сделать так, что бы после срытия курсоров,
они сохранялись, и в любой момент их можно было восстановить,
т.е. решить эту проблему:

но это чревато тем, что при падений скрипта, все ваши системные курсоры будут невидимыми :laugh:.


« Последнее редактирование: Октябрь 13, 2017, 17:46:17 от VadimKHL »

Русское сообщество AutoIt

Re: Скрытие курсора мыши на всем экране
« Ответ #7 Отправлен: Октябрь 12, 2017, 21:16:10 »

Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3999
  • Репутация: 960
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Скрытие курсора мыши на всем экране
« Ответ #8, Отправлен: Октябрь 13, 2017, 01:33:18 »
VadimKHL

ПредупреждениеЗа нарушение общих правил (пункт В.2):
Цитировать
Старайтесь избегать “Over quoting” (преувеличенное цитирование) - цитируйте только необходимую часть сообщения, которая наилучшим образом подчеркнёт суть цитируемого.


С уважением, ваш Глобальный модератор.

Скорблю и помню.




Оффлайн VadimKHL [?]

  • Новичок
  • *
  • Сообщений: 89
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Скрытие курсора мыши на всем экране
« Ответ #9, Отправлен: Октябрь 13, 2017, 21:58:50 »
Проверил. Убил системные курсоры.
После перезагрузки WIN курсоры снова отображаются корректно. :)

Вопрос, а как убрать курсоры, которые не системные, в разных приложения (типа paint) ?

Русское сообщество AutoIt

Re: Скрытие курсора мыши на всем экране
« Ответ #9 Отправлен: Октябрь 13, 2017, 21:58:50 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
6 Ответов
3861 Просмотров
Последний ответ Май 13, 2010, 16:30:45
от CreatoR
12 Ответов
4426 Просмотров
Последний ответ Сентябрь 13, 2011, 04:44:04
от CreatoR
2 Ответов
2018 Просмотров
Последний ответ Декабрь 15, 2011, 15:07:26
от agikon
7 Ответов
5771 Просмотров
Последний ответ Октябрь 24, 2012, 23:48:20
от Vagner_Hate
3 Ответов
1875 Просмотров
Последний ответ Декабрь 30, 2013, 09:13:08
от madmasles
1 Ответов
983 Просмотров
Последний ответ Май 22, 2014, 19:33:05
от InnI
2 Ответов
1237 Просмотров
Последний ответ Июнь 29, 2014, 13:28:22
от InnI
7 Ответов
3545 Просмотров
Последний ответ Октябрь 27, 2014, 04:23:30
от TD
5 Ответов
2002 Просмотров
Последний ответ Январь 16, 2015, 10:05:29
от kossvir
7 Ответов
413 Просмотров
Последний ответ Сентябрь 24, 2017, 13:11:06
от InnI