Что нового

[Элементы GUI] Donttouchthisbutton или "Не трожь кнопку!!!"

over7

Новичок
Сообщения
11
Репутация
2
AutoIt: v3.3.12.0
Версия: 1.0b

Категория: Элементы GUI

Описание: Пользователи.... пользователи никогда не меняются...
За многие годы работы ИТшником я точно знаю, что если дать возможность пользователю что-то сломать, он непременно ей воспользуется.
Остается только наблюдать и делать ставки, как быстро и как именно он сломает то или иное..
Единственный способ выжить, сохранить свой рассудок и при этом никого не убить -это относится к происходящему философски, ну и не помешает
отбирать права у пользователей, делать бесчисленное множество копий и бэкапов и все то, ради чего мне платят зарплату.
Тем не менее бывают случаи когда гуманные методы и имеющиеся решения на исходе, а фантазии у пользователей хоть отбавляй.
Здесь приходится включать думалку и искать кардинальное решение.

Проблема: Есть категория граждан, которые любят удалять свои файлы и папки с помощью комбинации клавиш Shift+Delete, а потом прибегать и просить все восстановить.
Решение: Скрыть кнопки на GUI, чтоб шаловливым ручонкам отважных юзерей нечего было нажимать.

Предлагаю Вашему вниманию скрипт блокировки кнопок окон (и не только кнопок).


Программа в самой начальной стадии разработки и здесь нет целого ряда функций, но уже есть чего показать.
Например, скрипт умеет блокировать кнопку "Да" при безвозвратном удалении файлов и папок (Shift+delete)
и блокирует кнопку восстановление инфы из теневых копий с общей папки в ту же самую папку (замечательная кнопка, способна похоронить всю работу целого отдела за несколько часов)

Код/Пример:
Код:
#AutoIt3Wrapper_Icon=Donttouchthisbutton.ico

; Прячу иконку из трея
Opt("TrayIconHide", 1)


; Файл с настройками должен иметь имя такое же что и сам скрипт, отличаясь только расширением
Local $sIniFile = StringTrimRight(@ScriptName, 3) & "ini"
If Not FileExists($sIniFile) Then
	MsgBox(16, "", "не нашел файл с настройками " & @LF & $sIniFile)
	Exit
EndIf

; Читаю настройки по блокированию элементов и заношу в глобальный массив
Global $aBadCtrls = _ReadINI($sIniFile)

; Счетчик открытых окон, используется в _WinChk()
Global $nWin = 0

; Горячая клавиша выхода из программы, читаю из ini в разделе MAIN, ключ HotKeyExit
; Для отключения хоткея ключ HotKeyExit оставляем пустым (HotKeyExit=)
Local $sHotKey = IniRead($sIniFile, "Main", "HotKeyExit", "!{F12}")
If $sHotKey <> "" Then HotKeySet($sHotKey, "_Exit")

Global $fStarted = True ; отслеживание включено
Global $fUnhide = False ; показать ранее спрятанные контролы

$sHotKey = IniRead($sIniFile, "Main", "HotKeyStartStop", "")
If $sHotKey <> "" Then HotKeySet($sHotKey, "_StartStop")

; Проверку окон на предмет "BadCtrl-ов" решил делать как Alib функцию, ИМХО лучше чем связываться со sleep =)
; Время срабатывания функции вынес в ini файл, раздел "Main", ключ "Time"
; По умолчанию Time= 150 милисек.
Local $T= Number(IniRead($sIniFile, "Main", "Time", ""))
If $T = 0 Then $T=150
AdlibRegister("_WinChk",$T)

; Вечный кайф
While Sleep(2147483647)
WEnd

Func _ReadINI($sIniFile)
	Local $i, $sSecName = "", $aSecName

	; Читаю секции INI файла
	Local $aSecNameAll = IniReadSectionNames($sIniFile)

	; Игнорирую секцию Main
	For $i = 1 To $aSecNameAll[0]
		If $aSecNameAll[$i] = "Main" Then ContinueLoop
		$sSecName &= $aSecNameAll[$i] & @LF
	Next
	$aSecName = StringSplit(StringTrimRight($sSecName, 1), @LF)

	; заношу в массив данные по секциям
	Local $aRes[1 + $aSecName[0]][4]
	For $i = 1 To $aSecName[0]
		$aRes[$i][0] = $aSecName[$i]
		$aRes[$i][1] = IniRead($sIniFile, $aSecName[$i], "Title", "")
		$aRes[$i][2] = IniRead($sIniFile, $aSecName[$i], "VisibleText", "")
		$aRes[$i][3] = IniRead($sIniFile, $aSecName[$i], "Control_ID", 9990)
	Next
	$aRes[0][0] = $aSecName[0]
	Return $aRes
EndFunc   ;==>_ReadINI


Func _WinChk()
	; Слежу за появлением новых окон
	; Смотрю есть ли окна с "BadCtrl-ами"
	; Если есть, "BadCtrl-ы" прячу
	If Not $fStarted Then Return
	
	Local $aList = WinList()
	If $aList[0][0] > $nWin Then
		; появилось новое окно
		$nWin = $aList[0][0]
		_ControlHide($aList)
	ElseIf $aList[0][0] < $nWin Then
		$nWin = $aList[0][0]
	EndIf

EndFunc   ;==>_WinChk


Func _ControlHide($aList, $sAct = "hide")
	Local $i, $j
	For $i = 1 To $nWin
		For $j = 1 To $aBadCtrls[0][0]
			If StringInStr($aList[$i][0], $aBadCtrls[$j][1]) Then
				; есть совпадение в заголовке окна
				If StringInStr(WinGetText($aList[$i][1]), $aBadCtrls[$j][2]) Then
					; есть совпадение в тексте окна
					Switch $sAct
						Case "hide"
							ControlDisable($aList[$i][1], WinGetText($aList[$i][1]), Number($aBadCtrls[$j][3])) ; отключаю
							ControlHide($aList[$i][1], WinGetText($aList[$i][1]), Number($aBadCtrls[$j][3])) ; прячу
						Case "show"
							ControlEnable($aList[$i][1], WinGetText($aList[$i][1]), Number($aBadCtrls[$j][3])) ; включаю
							ControlShow($aList[$i][1], WinGetText($aList[$i][1]), Number($aBadCtrls[$j][3])) ; отображаю
					EndSwitch
				EndIf
			EndIf
		Next
	Next
EndFunc   ;==>_ControlHide


Func _Exit()
	$fStarted = False
	_ControlHide(WinList(), "show")
	MsgBox(0, @ScriptName, "bye..", 1)
	Exit
EndFunc   ;==>_Exit

Func _StartStop()
	$fStarted = Not $fStarted
	If $fStarted Then
		$nWin = 0
	Else
		_ControlHide(WinList(), "show")
	EndIf
EndFunc   ;==>_StartStop

Файл: см вложение (исходник, ico, ini) (exe -не проходит по размеру :-( )

INI:
[Main]
Time =150
HotKeyExit =!{F12}
HotKeyStartStop = !{F1}


[Скрыть кнопку "Да" в диалоге Shift+Delete ]
Title =Удалить
VisibleText=Вы действительно хотите безвозвратно удалить
Control_ID=6

[Скрыть кнопку "Восстановить" при работе с теневыми копиями]
Title =Свойства:
VisibleText=Предыдущие версии можно получить из точек восстановления на сервере.
Control_ID=206


Снимок:



История версий:
1.0b
+ Добавлена возможность приостанавливать работу программы по горячей клавише.
(Горячая клавиша прописывается в ini файле, разделе [Main], опция HotKeyStartStop)
* Исправлено несколько ошибок

Источник: autoit-script.ru
Автор(ы): [email protected]
 

Вложения

  • Donttouchthisbutton.zip
    11.9 КБ · Просмотры: 11
Автор
O

over7

Новичок
Сообщения
11
Репутация
2
Пару комментариев по работе с прогой:

1. INI заполняется вручную
2. значения Title, VisibleText и Control_ID брал из "AutoIt v3 Window Info"

Планы:
Прикрутить инклюд от многоуважаемого InnI http://autoit-script.ru/index.php?topic=14400.0
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Нажатием Enter по прежнему можно удалить :laugh:.
 
Автор
O

over7

Новичок
Сообщения
11
Репутация
2
CreatoR сказал(а):
Нажатием Enter по прежнему можно удалить :laugh:.

Исправил :smile:
Код:
ControlDisable ($aList[$i][1], WinGetText($aList[$i][1]), Number($aBadCtrls[$j][3])) ; 
ControlHide($aList[$i][1], WinGetText($aList[$i][1]), Number($aBadCtrls[$j][3])) ;

отключаю потом прячу
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
over7 [?]
отключаю потом прячу
IMHO, вполне достаточно:
Код:
#include <Misc.au3>

Do
   $hWin = WinActive("[TITLE:Подтверждение удаления файла; CLASS:#32770]")
   ControlDisable($hWin, "", "[CLASS:Button]")
   Sleep(10)
Until _IsPressed("1B") = 1
 
Автор
O

over7

Новичок
Сообщения
11
Репутация
2
Garrett сказал(а):
over7 [?]
отключаю потом прячу
IMHO, вполне достаточно:
Код:
#include <Misc.au3>

Do
   $hWin = WinActive("[TITLE:Подтверждение удаления файла; CLASS:#32770]")
   ControlDisable($hWin, "", "[CLASS:Button]")
   Sleep(10)
Until _IsPressed("1B") = 1

Дык суть в том, чтоб запретить любые GUICtrl, которые можно идентифицировать по информации из окна, и пополнять ими коллекцию "запрещенных" в INI
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
over7 [?]
которые можно идентифицировать
Хотите сказать, что ваши пользователи будут пытаться идентифицировать GUICtrl? :smile:
 
Автор
O

over7

Новичок
Сообщения
11
Репутация
2
Garrett сказал(а):
over7 [?]
которые можно идентифицировать
Хотите сказать, что ваши пользователи будут пытаться идентифицировать GUICtrl? :smile:

Нет =)))
идентифицировать GUICtrl-ы буду я и пополнять INI файл тоже я, а пользователи не смогут больше тыкать куда не следует!


Вот например,
если в INI прописать следующее:
[Скрыть кнопку "Изменить часовой пояс"]
Title =Дата и время
VisibleText=Дата и время
Control_ID=126

то пользователи не смогут поменять часовой пояс =)
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Насчёт INI, то это как вам удобно! Я имел ввиду то, что можно просто деактивировать GUICtrl!
 

Sergio

Новичок
Сообщения
41
Репутация
3
А как быть если реально что то нужно удалить минуя корзину? Может быть через горячую клавишу заменить enter?
 
Автор
O

over7

Новичок
Сообщения
11
Репутация
2
Sergio, спасибо за интерес к программе.

Нет! заменять ничего не будем =)
Добавил возможность приостанавливать работу по горячей клавише.

Хоткей нужно прописать в ini
[Main]
....
HotKeyStartStop = !{F1} ; Alt+F1
...
 
Верх