Что нового

Пока не завершится цикл While 1 не начнётся другой цикл, как это обойти

sasha-ld

Новичок
Сообщения
48
Репутация
0
Доброго времени суток!
У меня такая проблема, на работе стоит комп, но я не хочу что бы кто попало лазал в нём без моего разрешения, я написал скрипт но он работает не совсем корректно
Помогите разобраться в чём дело:

Код:
#include <GUIConstants.au3>
GUICreate ("mygui")
$ch1 = Guictrlcreatecheckbox ("Блокировать мышь", 5, 5, 120, 20)
$ch2 = Guictrlcreatecheckbox ("Блокировать Photoshop", 5, 25, 150, 20)
$ch3 = Guictrlcreatecheckbox ("Блокировать Мой компьютер", 5, 45, 150, 20)
$button = GUICtrlCreateButton ("Принять", 5, 65, 70, 20)
guisetstate(@SW_HIDE)
guictrlsetstate(3, $gui_checked)
guictrlsetstate(5, $gui_checked)
hotkeyset ("^!s", "ggg")
hotkeyset ("+m", "mos")
hotkeyset("^e", "exits")

$m = 1
$m1 = 1
$m3 = 1
$win = winactive("Мой компьютер")

mos()
func mos()
	While ($m = 1) Or ($m = 3)
 if $m <> 1 Then ExitLoop
	$m = guictrlread($ch1)
	$mousex = mousegetpos()
	$mousey = mousegetpos()
	sleep(500)
	$2mousex = mousegetpos()
	$2mousey = mousegetpos()	
	if $2mousex[0] <> $mousex[0] and $2mousey[1] <> $mousey[1] Then
mousemove ($mousex[0], $mousey[1], 3)
EndIf
$win = winactive ("Мой компьютер")
	$m3 = guictrlread ($ch3)
if $win and $m3 = 1 Then
	sleep (500)
	winclose ($win)
	EndIf
	
wend
EndFunc



While 1
	$msg = guigetmsg()
	
Switch $msg
	
Case $GUI_EVENT_MINIMIZE
	GUISetState(@SW_HIDE)
	$m = 1
	$m3 = 1
	mos()
	
	Case $GUI_EVENT_CLOSE
		Exit
	
	Case $ch1
	$m = guictrlread($ch1)
	
Case $ch2
	$m1 = guictrlread($ch2)
	
Case $ch3
	$m3 = guictrlread($ch3)	
	
Case $button
	guisetstate(@SW_HIDE)
	$m = 1
	$m3 = 1
	mos()
		
EndSwitch
    
	WEnd
			
func exits()
	Exit
EndFunc
	
func ggg()
	GUISetState (@SW_SHOW)
	$m = 0	
	$m3 = 0
	EndFunc


Вообщем вот так, если я вырубаю блокировку мыши то и Мой компьютер тоже закрываться не будет, как я только не пробовал, не получается, я новичок, и мне самому интересно, вообще можно это реализовать, пробовал делать отдельные функции, мышь зацикливал отдельно, а комп одельно, но пока не завершится цикл мыши комп не работает, я зашёл в тупик
Кто что подскажет?
Заранее благодарен!


Вот попробовал так
В цикл вложить ещё цикл но как то не совсм корректно

Код:
func mos()
	While $m = 1
 if $m <> 1 Then ExitLoop
	$m = guictrlread($ch1)
	$mousex = mousegetpos()
	$mousey = mousegetpos()
	sleep(500)
	$2mousex = mousegetpos()
	$2mousey = mousegetpos()	
	if $2mousex[0] <> $mousex[0] and $2mousey[1] <> $mousey[1] Then
mousemove ($mousex[0], $mousey[1], 3)
EndIf
While $m3 = 1
$win = winactive ("Мой компьютер")
	$m3 = guictrlread ($ch3)
if $win and $m3 = 1 Then
	sleep (500)
	winclose ($win)
	EndIf
	WEnd
wend
EndFunc
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Re: Не могу разобраться с циклами

Попробуй это:
Locker.au3

Пароль: 5555, заменить можешь в скрипте.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Re: Не могу разобраться с циклами

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Как правильно называть темы

"Не могу разобраться с циклами" - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, Модератор раздела.








Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, Модератор раздела.
 
Автор
S

sasha-ld

Новичок
Сообщения
48
Репутация
0
Спасибо большое Zaramot
красивый скрипт
а на мойм примере как нить можно реализовать, просто есть начальник и он запрещает ставить под пароль, а я хочу сделать так, чтобы никаких нерв не хватило на нём работать, и соответственно не совсем заметно, это ещё не весь скрипт, остальное допишу потом, главное мне сейчас с этим разобраться
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
На сколько я пенял, тебе нужно заблокировать Мышь, Photoshop и Мой компьютер. Если да, то попробуй так:
Код:
#NoTrayIcon
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>

$Form1 = GUICreate(" Блокер", 185, 110, -1, -1, -1, $WS_EX_TOOLWINDOW)
$Radio1 = GUICtrlCreateRadio("Блокировать мышь", 8, 8, 153, 17)
$Radio2 = GUICtrlCreateRadio("Блокировать Photoshop", 8, 32, 153, 17)
$Radio3 = GUICtrlCreateRadio("Блокировать Мой Компьютер", 8, 56, 169, 17)
$Button1 = GUICtrlCreateButton("Принять", 48, 80, 75, 25)
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			;Блокируем мышь
			If GUICtrlRead($Radio1) = 1 Then
				$mouse = MouseGetPos()
				Do
					MouseMove($mouse[0], $mouse[1], 0)
				Until _IsPressed('79')
			EndIf
			;Блокируем Photoshop
			If GUICtrlRead($Radio2) = 1 Then
				Do
					If ProcessExists('photoshop.exe') Then ProcessClose('photoshop.exe')
				Until _IsPressed('7A')
			EndIf
			;Блокируем Мой компьютер
			If GUICtrlRead($Radio3) Then
				Do
					If WinExists('Мой компьютер') Then WinClose('Мой компьютер')
				Until _IsPressed('7B')
			EndIf
	EndSwitch
WEnd


F10 - Разблокировать Мышь
F11 - Разблокировать Photoshop
F12 - Разблокировать Мой компьютер
 
Автор
S

sasha-ld

Новичок
Сообщения
48
Репутация
0
Всем здравствуйте!
Наконец то я написал то что хотел написать. Сначала я не мог решить проблему с циклами, так как пока не завершится первый
не запускались остальныеа у меня мышь циклится до выключения пользователем, но удалось решить по такой схеме:

Код:
While 1

while 1
...
...
exitloop
wend 

while 1
...
...
exitloop
wend

while 1
...
...
exitloop
wend

wend


так же решил проблему с таймером с помощью функции _TimeToTicks
Вот собственно и сам код

Код:
#include <GUIConstantsEX.au3>
#include <Timers.au3>
#include <Date.au3>
#include <WindowsConstants.au3>
Opt ("TrayIconHide", 1)

$GUI = GUICreate ("Настройки", 200, 100, -1, - 1, $WS_popup+$ws_border)
$ch1 = Guictrlcreatecheckbox ("Блокировать мышь", 5, 5, 120, 20)
$ch2 = Guictrlcreatecheckbox ("Блокировать Photoshop", 5, 25, 150, 20)
$ch3 = Guictrlcreatecheckbox ("Блокировать Папки", 5, 45, 150, 20)
$button = GUICtrlCreateButton ("Принять", 5, 65, 70, 20)
guisetstate(@SW_HIDE, $GUI)

guictrlsetstate(3, $gui_unchecked)
guictrlsetstate(4, $gui_checked)
guictrlsetstate(5, $gui_checked)
hotkeyset ("^!s", "ggg")
hotkeyset("^e", "exits")

$trans=200
$t = 0
$m = 0
$m1 = 1
$m3 = 1
$i=0

all()

	func all()
		while 1
	if $m<>1 and $m1<>1 and $m3<>1 then ExitLoop
	if processexists("taskmgr.exe") Then
processclose("taskmgr.exe")
EndIf
mos()
photoshop()
folders()
WEnd
EndFunc

	func mos()
$m = guictrlread($ch1)
	While 1
if $m <> 1 then Exitloop
$mousex = mousegetpos()
sleep(100)
$2mousex = mousegetpos()
	if $2mousex[0] > $mousex[0] Then
mousemove($2mousex[0]-20, $2mousex[1],10)
	elseif $2mousex[0] < $mousex[0] Then
mousemove($2mousex[0]+20, $2mousex[1],10)
EndIf
	if $2mousex[1] > $mousex[1] Then
mousemove($2mousex[0], $2mousex[1]-20,10)
	elseif $2mousex[1] < $mousex[1] Then
mousemove($2mousex[0], $2mousex[1]+20,10)
EndIf
exitloop
wend
EndFunc

	Func timer()
$StartTicks = _TimeToTicks(@hour, @min, @SEC)
Global $EndTicks = $StartTicks + 120000
$t = 1
EndFunc
 


	func photoshop()
$ph = processexists("photoshop.exe")
$m1 = guictrlread($ch2)
	while 1
	if $ph and $m1 = 1 and $t = 0 Then
timer()
	elseif $ph and $m1 = 1 and $t = 1 Then
	if _TimeToTicks(@hour, @min, @SEC) >= $endticks Then
processclose("photoshop.exe")
$t=0
EndIf
ExitLoop
EndIf
ExitLoop
WEnd
EndFunc

	func folders()
$wintit=wingettitle("[CLASS:CabinetWClass]", "")
	if $wintit<>"0" then
sleep(500)
winclose("[CLASS:CabinetWClass]")
$i=$i+1
	if $i>=5 Then
msgbox(16,"System error","Explorer error 0x0193929291 and 0x9430984930", 7)
processclose("explorer.exe")
$i=0
EndIf
EndIf
EndFunc


	func exits()
	For $i = 255 To 0 Step -5
Sleep(1)
WinSetTrans ($GUI,'',$i)
Next
Exit
EndFunc


	func ggg()
	For $i = 0 To 255 Step 5
sleep(1)
WinSetTrans ($GUI,'',$i)
GUISetState (@SW_SHOW, $gui)
Next
$t=0
menu()
EndFunc

	func menu()
	While 1
$msg = guigetmsg($GUI)
	Switch $msg
if $msg = @sw_hide then	ExitLoop
	Case $button
	For $i = 255 To 0 Step -5
sleep(1)
WinSetTrans ($GUI,'',$i)
Next
Guisetstate(@SW_HIDE)
all()
	Case $GUI_EVENT_CLOSE
Exit
	Case $ch1
$m = guictrlread($ch1)
	Case $ch2
$m1 = guictrlread($ch2)
	Case $ch3
$m3 = guictrlread($ch3)
EndSwitch
WEnd
EndFunc


если кому не трудно напишите пожалуйста, какие у меня есть ошибки, может можно было написать по другому, и легче, но мне надо было что бы прога работала именно так, просто я совсем новичок, писал программу и одновременно учил, если есть ошибки логические или другие напишите кому не трудно

Спасибо
 
Автор
S

sasha-ld

Новичок
Сообщения
48
Репутация
0
Нет, ошибки нет, прога работает, а что касается цикла, возьмём функцию mos()

Код:
; Эта функция отвечает за не послушную мышь	
func mos()
$m = guictrlread($ch1)
While 1
if $m <> 1 then Exitloop  ; вот здесь при проверке если $m не равно одному, то как мне выйти из функции без цикла
$mousex = mousegetpos()
sleep(100)
$2mousex = mousegetpos()
if $2mousex[0] > $mousex[0] Then
mousemove($2mousex[0]-20, $2mousex[1],10)
elseif $2mousex[0] < $mousex[0] Then
mousemove($2mousex[0]+20, $2mousex[1],10)
EndIf
if $2mousex[1] > $mousex[1] Then
mousemove($2mousex[0], $2mousex[1]-20,10)
elseif $2mousex[1] < $mousex[1] Then
mousemove($2mousex[0], $2mousex[1]+20,10)
EndIf
exitloop
wend
EndFunc
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
А такая стратегия? После запуска скрипта ESC жми, когда надоест.
Код:
#NoTrayIcon
#include <Array.au3>
HotKeySet("{ESC}", "Restore") ;нажать на ESC для показа скрытых окон и завершения скрипта
Dim $aVar1[1]
While 1
    Sleep(50)
    $Var2 = WinWaitActive("")   
    Global $Var3 = UBound($aVar1)-1
    If $Var2 <> $aVar1[$Var3] Then
    _ArrayAdd( $aVar1,$Var2)    
    WinSetState($Var2, "", @SW_HIDE)    
    EndIf
WEnd
Func Restore()
    MsgBox(64,"Восстановление","Показать ранее скрытые окна")
    For $i = 0 To $Var3
        WinSetState($aVar1[$i], "", @SW_SHOW)
    Next
    Exit
EndFunc
 
Верх