У меня в коде обращение к @GUI_CTRLID приводит к вылету, хотя GUIOnEventMode включен.
Код:
Opt('GUIOnEventMode', 1)
Opt('TrayOnEventMode', 1)
Opt('TrayMenuMode', 3)
Opt('MustDeclareVars', 1)
Opt('TrayIconHide', 0)
#include <Constants.au3>
#include <GUIConstantsEx.au3>
#include <File.au3>
#include <Array.au3>
HotKeySet('+{ESC}', 'Terminate')
Global $fileReStart = "ReStart.exe"
Global $fileScanerToArhive = "ScanerToArhive.exe"
Global $pathIn = "C:\Сканер\"
Global $fileList = _FileListToArray($pathIn, "*", 1)
Global $fileListBefore = _FileListToArray($pathIn, "*", 1)
Global $dirSize = DirGetSize ($pathIn, 3)
Global $filesCountBefore = $dirSize[1]
Global $pathTo = "\\tmp\"
;~ Global $pathTo = "C:\tmp\"
Global $scanTitle = "EPSON Scan"
Global $winTitle = "СканерОк"
Global $userPath = "none"
Global $i, $resOld, $filesCountAfter, $lastFile, $trayShowOrHide, $res, $editBefore, $cTime, $filesCount, $lastFile, $btnShowOrHide, $arg, $fileListAfter, $temp, $mainWinHide = 0, $scanWinHide = 1
If WinExists($winTitle) Then
WinSetState($winTitle, "", @SW_ENABLE)
WinSetState($winTitle, "", @SW_SHOW)
WinActivate($winTitle)
Terminate()
EndIf
;################################################################################
$trayShowOrHide = TrayCreateItem("Скрыть")
TrayItemSetOnEvent(-1, "ShowOrHideMain")
TrayCreateItem("")
TrayCreateItem("Сканировать")
TrayItemSetOnEvent(-1, "Scaning")
TrayCreateItem("Архивировать")
TrayItemSetOnEvent(-1, "ScanerToArhive")
TrayCreateItem("Перезапустить")
TrayItemSetOnEvent(-1, "ReStart")
TrayCreateItem("")
TrayCreateItem("Выход")
TrayItemSetOnEvent(-1, "Terminate")
TraySetOnEvent($TRAY_EVENT_PRIMARYDOWN, "ShowOrHideMain" )
TraySetOnEvent($TRAY_EVENT_PRIMARYDOUBLE, "ShowOrHideMain" )
TraySetIcon("icon.ico")
TraySetClick(16)
;################################################################################
GUICreate($winTitle, 450, 500)
;~ GUISetOnEvent($GUI_EVENT_CLOSE, 'Terminate')
GUISetOnEvent($GUI_EVENT_CLOSE, 'ShowOrHideMain')
GUISetOnEvent($GUI_EVENT_MINIMIZE, 'ShowOrHideMain')
GUICtrlCreateRadio('Шамтиев', 15+150, 15, 100, 20)
GUICtrlSetOnEvent(-1, 'Terminate')
GUICtrlCreateRadio('Кудашова', 15+150, 35, 100, 20)
GUICtrlSetOnEvent(-1, 'Terminate')
GUICtrlCreateRadio('Крамарь', 15+150, 55, 100, 20)
GUICtrlSetOnEvent(-1, 'Terminate')
GUICtrlCreateRadio('Литвинчук', 15+150, 75, 100, 20)
GUICtrlSetOnEvent(-1, 'Terminate')
GUICtrlCreateRadio('Ткаленко', 15+150, 95, 100, 20)
GUICtrlSetOnEvent(-1, 'Terminate')
GUICtrlCreateRadio('Хвиль', 15+150, 115, 100, 20)
GUICtrlSetOnEvent(-1, 'Terminate')
GUICtrlCreateLabel('Файлов в папке:', 15, 475, 90, 20)
Global $label = GUICtrlCreateLabel('*', 15+90, 475, 90, 20)
GUICtrlCreateButton('Скопировать один файл', 145+150, 15, 150, 25)
GUICtrlSetOnEvent(-1, 'CopyFiles')
GUICtrlCreateButton('Скопировать два файла', 145+150, 15+25, 150, 25)
GUICtrlSetOnEvent(-1, 'CopyFiles')
GUICtrlCreateButton('Скопировать три файла', 145+150, 15+25+25, 150, 25)
GUICtrlSetOnEvent(-1, 'CopyFiles')
GUICtrlCreateButton('Скопировать четыре файла', 145+150, 15+25+25+25, 150, 25)
GUICtrlSetOnEvent(-1, 'CopyFiles')
GUICtrlCreateButton('Скопировать пять файлов', 145+150, 15+25+25+25+25, 150, 25)
GUICtrlSetOnEvent(-1, 'CopyFiles')
GUICtrlCreateButton('Сканировать', 15, 15, 120, 80)
GUICtrlSetOnEvent(-1, 'Scaning')
GUICtrlCreateButton('Перезапустить', 15, 15+80, 100, 20)
GUICtrlSetOnEvent(-1, 'ReStart')
GUICtrlCreateButton('П', 15+100, 15+80, 20, 20)
GUICtrlSetOnEvent(-1, 'ReStart')
$btnShowOrHide = GUICtrlCreateButton('Скрыть/Показать', 15, 15+80+20, 120, 20)
GUICtrlSetOnEvent(-1, 'ShowOrHide')
GUICtrlCreateButton('Архивировать файлы', 180, 465, 120, 25)
GUICtrlSetOnEvent(-1, 'ScanerToArhive')
GUICtrlCreateButton('В трей', 345, 465, 100, 25)
;~ GUICtrlSetOnEvent(-1, 'Terminate')
GUICtrlSetOnEvent(-1, 'ShowOrHideMain')
Global $edit = GUICtrlCreateEdit('', 15, 165, 450-30, 300-15)
GUISetState()
If Not ProcessExists("escndv.exe") Then
ReStart()
EndIf
While 1
ScanPath()
GUICtrlSetData($label, $filesCount & " (" & Round($dirSize[0] / 1024) & " KB)")
Sleep(1000)
WEnd
;################################################################################
Func CopyFiles()
$fileList = _FileListToArray($pathIn, "*", 1)
$i = $fileList[0]
$lastFile = $fileList[$i]
Switch @GUI_CTRLID
Case 11
FileCopyToUserPath($userPath)
Case 12
FileCopyToUserPath($userPath)
FileCopyToUserPath($userPath)
Case 13
FileCopyToUserPath($userPath)
FileCopyToUserPath($userPath)
FileCopyToUserPath($userPath)
Case 14
FileCopyToUserPath($userPath)
FileCopyToUserPath($userPath)
FileCopyToUserPath($userPath)
FileCopyToUserPath($userPath)
Case 15
FileCopyToUserPath($userPath)
FileCopyToUserPath($userPath)
FileCopyToUserPath($userPath)
FileCopyToUserPath($userPath)
FileCopyToUserPath($userPath)
Case Else
$res = " Ошибка индекса контрола."&@CRLF
Logging()
EndSwitch
EndFunc
;################################################################################
Func FileCopyToUserPath($arg)
$fileList = _FileListToArray($pathIn, "*", 1)
If FileExists($pathIn&$lastFile) Then
If $userPath <> "none" Then
$res = FileCopy($pathIn&$lastFile, $pathTo&$arg)
ConsoleWriteError($res)
If $res == 1 Then
$res = " Копирование '"&$lastFile&"' в '"&$pathTo&$userPath&"' завершено."&@CRLF
Else
$res = " Копирование '"&$lastFile&"' в '"&$pathTo&$userPath&"' не удалось."&@CRLF
EndIf
$i = $i - 1
Logging()
$lastFile = $fileList[$i]
Else
$res = " Необходимо указать папку пользователя."&@CRLF
Logging()
EndIf
EndIf
EndFunc
Func ScanPath()
$dirSize = DirGetSize($pathIn, 3)
$filesCount = $dirSize[1]
$filesCountAfter = $dirSize[1]
If $filesCountAfter > $filesCountBefore Then
$fileList = _FileListToArray($pathIn, "*", 1)
$res = " Новый файл: '"&$fileList[$filesCountAfter]&"'."&@CRLF
Logging()
$filesCountBefore = $dirSize[1]
EndIf
EndFunc
Func Logging()
$cTime = @HOUR&":"&@MIN&":"&@SEC&" "
$editBefore = GUICtrlRead($edit)
;~ If $resOld <> $res Then
GUICtrlSetData($edit, $cTime&$res&@CRLF&$editBefore&" ")
;~ EndIf
If $mainWinHide == 1 Then
TrayTip("", $res, 5)
EndIf
;~ $resOld = $res
EndFunc
Func Scaning()
$filesCountBefore = $dirSize[1]
If WinExists("Ход работы") Then
$res = " Сканирование уже идет..."&@CRLF
Else
If Not ProcessExists($fileReStart) Then
ControlClick($scanTitle, "", "[CLASS:Button; INSTANCE:22]", "left", 1)
$res = " Попытка сканирования..."&@CRLF
Else
$res = " Обработчик не запущен."&@CRLF
EndIf
EndIf
Logging()
EndFunc
Func ReStart()
$filesCountBefore = $dirSize[1]
If ProcessExists("escndv.exe") Then
ConsoleWrite(@GUI_CTRLID)
If WinExists("Ход работы") Then
$res = " Перезапуск отменен, идет сканирование."&@CRLF
Else
If Not ProcessExists($fileReStart) Then
Run($fileReStart)
$res = " Перезапуск обработчика..."&@CRLF
EndIf
EndIf
Else
If WinExists("Ход работы") Then
$res = " Запуск отменен. Идет сканирование..."&@CRLF
Else
If Not ProcessExists($fileReStart) Then
Run($fileReStart)
$res = " Запуск обработчика..."&@CRLF
EndIf
EndIf
EndIf
MsgBox(1, @GUI_CTRLID, @GUI_CTRLID)
If @GUI_CTRLID == 18 Then
ProcessClose("escndv.exe")
Run($fileReStart)
$res = " Принудительный перезапуск обработчика..."&@CRLF
EndIf
Logging()
EndFunc
Func ScanerToArhive()
If Not ProcessExists($fileScanerToArhive) Then
Run($fileScanerToArhive)
$res = " Архивация файлов..."&@CRLF
EndIf
Logging()
$filesCountBefore = $dirSize[1]
EndFunc
Func ShowOrHide()
If $scanWinHide == 0 Then
WinSetState($scanTitle, "", @SW_DISABLE)
WinSetState($scanTitle, "", @SW_HIDE)
GUICtrlSetData($btnShowOrHide, 'Показать')
$scanWinHide = 1
Else
WinSetState($scanTitle, "", @SW_ENABLE)
WinSetState($scanTitle, "", @SW_SHOW)
WinActivate($scanTitle)
GUICtrlSetData($btnShowOrHide, 'Скрыть')
$scanWinHide = 0
EndIf
EndFunc
Func ShowOrHideMain()
If $mainWinHide == 0 Then
WinSetState($winTitle, "", @SW_DISABLE)
WinSetState($winTitle, "", @SW_HIDE)
TrayItemSetText($trayShowOrHide, 'Показать')
$mainWinHide = 1
Else
WinSetState($winTitle, "", @SW_ENABLE)
WinSetState($winTitle, "", @SW_SHOW)
WinActivate($winTitle)
TrayItemSetText($trayShowOrHide, 'Скрыть')
$mainWinHide = 0
EndIf
EndFunc
Func Ops()
MsgBox(0, "Внимание", "Не нужно закрывать это окно. Достаточно свернуть его.", 10)
EndFunc
;################################################################################
Func Terminate()
Exit
EndFunc