Здравствуйте.
Использую AutoIt v3.3.8.1
Хочу реализовать отслеживание продолжительности нахождения курсора над иконкой в трее запущенной программы.
Принцип работы такой:
Наведение курсора на иконку запускает функцию которая отобразит окно с данными. Окно с данными закроется по прошествии 8-и секунд или при потере фокуса. Как в данном случае отследить продолжительность нахождения курсора над иконкой? Для вычисления продолжительности данного события.
Использую AutoIt v3.3.8.1
Хочу реализовать отслеживание продолжительности нахождения курсора над иконкой в трее запущенной программы.
Принцип работы такой:
Наведение курсора на иконку запускает функцию которая отобразит окно с данными. Окно с данными закроется по прошествии 8-и секунд или при потере фокуса. Как в данном случае отследить продолжительность нахождения курсора над иконкой? Для вычисления продолжительности данного события.
Код:
#include <GUIConstantsEx.au3>
#include <Constants.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=FreeSpace.ico
#AutoIt3Wrapper_Outfile=H:\FreeSpace.exe
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_UPX_Parameters=--lzma --no-backup --best --compress-icons=2 --ultra-brute --crp-ms=999999 -f
#AutoIt3Wrapper_Res_Comment=Программа отображения свободного пространства на дисках.
#AutoIt3Wrapper_Res_Description=Программа отображения свободного пространства на дисках.
#AutoIt3Wrapper_Res_Fileversion=1.0.0.1
#AutoIt3Wrapper_Res_LegalCopyright=Copyright © 2013 IvSaTEL
#AutoIt3Wrapper_Res_requestedExecutionLevel=highestAvailable
#AutoIt3Wrapper_Res_Field=CompanyName|IvSatel
#AutoIt3Wrapper_Res_Field=Автор|IvSatel
#AutoIt3Wrapper_Run_Tidy=y
#endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
Opt("TrayMenuMode", 1 + 2)
TraySetToolTip('Свободное пространство на дисках.')
Global $hGUI, $aArray, $aFreeS[1], $iVisota = @DesktopHeight, $iShiryna = @DesktopWidth, $hTimer, $iCheck
_Wait()
;################################ Функция ожидания
Func _Wait()
HotKeySet('{Esc}') ; Назначение пустого значения на горячую клавишу
While 1
Sleep(500)
Switch TrayGetMsg() ; Ожидание события трея
Case $TRAY_EVENT_MOUSEOVER
_GetWindow() ; Запустить основную функцию при событии трея
EndSwitch
WEnd
EndFunc ;==>_Wait
;################################ Функция ожидания
;################################ Основная функция получения свободного пространства на дисках
Func _GetWindow()
HotKeySet('{Esc}', '_ProExit') ; Назначение функции на горячую клавишу
$aArray = DriveGetDrive("ALL") ; Получение массива дисков
If @error Then ; Если ошибка
MsgBox(4096, "Ошибка", "Произошла ошибка при запросе дисков.")
Exit
EndIf
For $i = 1 To UBound($aArray) - 1 ; Цикл получения размеров свободного пространства на найденных дисках
$iFreeSpace = Round(DriveSpaceFree($aArray[$i]), -1)
If $iFreeSpace <> '0' Then ; Если полученный результат не равен нулю то заносим его в массив
If StringLen($iFreeSpace) >= 4 Then ; Если количество символов более 3-х то Гигабайты
$iSize = 'Gb'
Else
$iSize = 'Mb'
EndIf
_ArrayAdd($aFreeS, 'На диске ' & StringUpper($aArray[$i]) & '\' & ' свободно ' & _
StringRegExpReplace($iFreeSpace, '(\A\d{1,3}(?=(\d{3})+\z)|\d{3}(?=\d))', '\1 ') & ' ' & $iSize)
EndIf
Next
;#################### Создание окна с результатами
$hGUI = GUICreate('Свободное место на дисках', 200, (UBound($aFreeS) * 13) + 5, $iShiryna - 200, $iVisota, $WS_CAPTION, BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW))
$mylist = GUICtrlCreateList("", 5, 5, 190, (UBound($aFreeS) * 13))
For $i = 1 To UBound($aFreeS) - 1 ; Заполнение Листвью созданным массивом
GUICtrlSetData($mylist, $aFreeS[$i])
Next
GUISetState(@SW_SHOW)
For $i = 1 To (UBound($aFreeS) * 13) + 67 ; Перемещение окна. Всплывание.
WinMove($hGUI, "", $iShiryna - 205, $iVisota - $i)
Next
$hTimer = TimerInit() ; Установка таймера.
While 1
Switch TrayGetMsg() ; События Tray
Case $TRAY_EVENT_MOUSEOUT
GUIDelete($hGUI)
For $i = 1 To UBound($aFreeS) - 1 ; Очищение массива
_ArrayDelete($aFreeS, $i)
Next
_Wait()
Return
EndSwitch
If TimerDiff($hTimer) > 8000 Then ; Если больше 8-и секунд то выход с очищением массива.
GUIDelete($hGUI)
For $i = 1 To UBound($aFreeS) - 1 ; Очищение массива
_ArrayDelete($aFreeS, $i)
Next
_Wait()
Return
EndIf
If Not WinActive($hGUI) Then
GUIDelete($hGUI)
For $i = 1 To UBound($aFreeS) - 1 ; Очищение массива
_ArrayDelete($aFreeS, $i)
Next
_Wait()
Return
EndIf
WEnd
EndFunc ;==>_GetWindow
;################################ Основная функция получения свободного пространства на дисках
;################################ Функция выхода из программы
Func _ProExit()
If WinExists($hGUI) Then
If MsgBox(1 + 32 + 8192, '', 'Завершить работу приложения?') = 1 Then
GUIDelete($hGUI)
Exit
Else
GUIDelete($hGUI)
For $i = 1 To UBound($aFreeS) - 1 ; Очищение массива
_ArrayDelete($aFreeS, $i)
Next
_Wait()
Return
EndIf
EndIf
EndFunc ;==>_ProExit