Показать полную графическую версию : [архив - Часть 2] AutoIt скрипты
Diamond,
как раз именно из-за постоянных мельканий элементов
Но они у меня и до этого мелькали ;)
с точки зрения пользователя было бы некорректно заменять текущий курсор на новый
Согласен, поищу на оф. форме, может есть метод получить текущий курсор (хотя я уверен что есть, нужно просто хорошенько поискать, ну или вежливо спросить :) ).
При нажатии на тоновую шкалу (точнее при отпускании мышки с $GrCover) происходило определение цвета тоновой шкалы, и это не зависило от Пипетки
Ну, не уверен, но у меня и сейчас всё нормально определяется (или я не понял про что речь?)...
Вместо этого добавился глюк: При клике по $GrCover запускается последнее действие
Хм.. видимо фокус остаётся на последнем элементе, и WM_COMMAND срабатывает намного быстрее чем фокус меняется на используемый элемент (на который была нажата мышка), поэтому чтобы это поправить, нужно всего лишь заменить строку получения сфокусирорванного элемента, на $LParam (твой метод ;)) :
Local $FocusedHandel = $LParam;ControlGetHandle($hWndGUI, "", ControlGetFocus($hWndGUI))
Не @SW_HIDE а @SW_DISABLE
Именно @SW_HIDE (для WinSetState()), ведь эффект там происходил скрытия окна а не деактивирования... но это не столь важно.
P.S
Я если честно, считаю что переделав весь подход к подобному скрипту (методы решения и использование функции/вызовы), можно добиться идеальных результатов (где ничего не будет мелькать, и при этом обновляться в реальном времени)... но у меня пока (и полагаю что у тебя тоже), времени на это совсем нету :(
Ребят, почитав ЧаВо понял, что реализовать скрипт, который будет выключать определённую галочку в настройках панели задач можно(?), но не силён я в AutoIt'е, можно сказать вообще. Ответьте на такой вопрос, можно ли автоматизировать следующее действие:
http://img518.imageshack.us/img518/3683/17536985ih7.png (http://imageshack.us)
http://img518.imageshack.us/img518/3683/17536985ih7.53abb8a6c7.jpg (http://g.imageshack.us/g.php?h=518&i=17536985ih7.png)
Maza Faka
23-09-2007, 15:00
SAOPP
Попробуй:
Opt("WinTitleMatchMode", 4)
$tray = "Classname=Shell_TrayWnd"
ControlFocus($tray, "", "ToolbarWindow322")
ControlClick($tray, "", "ToolbarWindow322", "right")
Send("{UP 8}")
Send("{RIGHT}")
Send("{DOWN 3}")
Send("{ENTER}")
Maza Faka, спасибо, сразу бросается тот факт, что если исполнять клик курсором ближе к трею, то
Send("{RIGHT}") »
скорее всего нужно переводить в 'LEFT' - но не факт, если при первом логоне курсор из центра экрана переместится в центр панели задач - думаю всё пройдёт гладко, спасибо ещё раз, сейчас скомпилю испробую.
Ха-ха, Maza Faka, огромное спасибо, только пришлось по каким то причинам мне убрать на один пункт движение вниз :) получилось следующее:
Opt("WinTitleMatchMode", 4)
$tray = "Classname=Shell_TrayWnd"
ControlFocus($tray, "", "ToolbarWindow322")
ControlClick($tray, "", "ToolbarWindow322", "right")
Send("{UP 8}")
Send("{RIGHT}")
Send("{DOWN 2}")
Send("{ENTER}")
Осталось протестировать процесс во время тихого инсталлятора, собсно для чего и затевался с этим :)
только пришлось по каким то причинам мне убрать на один пункт движение вниз »
Этот факт обусловлин отсутствием у меня в этом меню Windows Media Player'а и ессно его минибара для панели задач, т.е. здесь уже нужно подстраиваться под "общий" вид, т.е. с медиаплеером. Ещё раз спасибо.
SAOPP,
Вместо LEFT/RIGHT можно использовать Enter ;) , а также Opt(...) не нужен, сегодня в Аутоите уже есть метод более практичнее...
$TrayTitle = "[CLASS:Shell_TrayWnd]"
ControlFocus($TrayTitle, "", "ToolbarWindow322")
ControlClick($TrayTitle, "", "ToolbarWindow322", "right")
Send("{DOWN}") ;почему 8 раз UP, когда можно в обратную сторону один раз DOWN? :)
Send("{ENTER}")
Send("{DOWN 2}")
Send("{ENTER}")
TERMINAL
24-09-2007, 10:56
Народ! помогите на скрипте написать прогу которая ждёт 10 минут и если пользователь не нажимал ни одной клавиши (короче отсутствовал) тогда комп просто выключается.
TERMINAL,
написать прогу которая ждёт 10 минут и если пользователь не нажимал ни одной клавиши (короче отсутствовал) тогда комп просто выключается.
Лови (функция _IdleWaitCommit() написана by amel27, я её лишь немного подправил для данного примера):
HotKeySet("^q", "Quit")
$Minutes = 10 ;Тут задаётся интервал ожидания в минутах
While 1
$Timer = TimerInit()
_IdleWaitCommit(0)
WEnd
Func _IdleWaitCommit($idlesec)
Local $iSave, $LastInputInfo = DllStructCreate ("uint;dword")
DllStructSetData ($LastInputInfo, 1, DllStructGetSize ($LastInputInfo))
DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo))
Do
$iSave = DllStructGetData ($LastInputInfo, 2)
Sleep(100)
DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo))
If TimerDiff($Timer) >= $Minutes * 60000 Then
MsgBox(64, "Внимание", "10 минут спустя, а хозяина нету ;)", 10)
;Shutdown(1 + 4) ;Force Shutdown
ExitLoop
EndIf
Until (DllStructGetData ($LastInputInfo, 2)-$iSave) > $idlesec
Return DllStructGetData ($LastInputInfo, 2)-$iSave
EndFunc
Func Quit()
Exit
EndFunc
Я закоментировал на всякий случай строку с выключением компа (;Shutdown(1 + 4) ;Force Shutdown).
TERMINAL
24-09-2007, 11:46
Creat0R, Это всё хорошо, но а как сделать если он есть, то прога просто использует EXIT.
Суть такая - комп после 2х часовой задачи идёт на перезагрузку (например ставлю на ночь). После загрузки винды прога эта автоматом загружается и смотрит-если я нажал кнопку на клаве или открыл любое окно (эфект присутствия) то она просто делает выход, а если никто ничего не делал в течении 10 минут-прога выключает комп....
Вместо LEFT/RIGHT можно использовать Enter , а также Opt(...) не нужен, сегодня в Аутоите уже есть метод более практичнее... »
К сожалению я не силён в этом и разбираться нет времени, товарищ помог мне и я очень ему благодарен, что же касается описанного, то чем лучше и практичнее будет выглядеть эта операция? :)
TERMINAL,
как сделать если он есть, то прога просто использует EXIT
Просто вытащий из цикла:
#NoTrayIcon
$Minutes = 10 ;Тут задаётся интервал ожидания в минутах
Sleep(1000)
$Timer = TimerInit()
_IdleWaitCommit(0)
Func _IdleWaitCommit($idlesec)
Local $iSave, $LastInputInfo = DllStructCreate ("uint;dword")
DllStructSetData ($LastInputInfo, 1, DllStructGetSize ($LastInputInfo))
DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo))
Do
$iSave = DllStructGetData ($LastInputInfo, 2)
Sleep(100)
DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo))
If TimerDiff($Timer) >= $Minutes * 60000 Then
MsgBox(64, "Внимание", "10 минут спустя, а хозяина нету ;)", 10)
;Shutdown(1 + 4) ;Force Shutdown
ExitLoop
EndIf
Until (DllStructGetData ($LastInputInfo, 2)-$iSave) > $idlesec
Return DllStructGetData ($LastInputInfo, 2)-$iSave
EndFunc
Всё, теперь при первом запуске, если ничего не нажимать (и не двигать мышку), скрипт будет ждать 10 минут и выключит комп, если в течении этого времени юзер что-то сделает :), то скрипт завершит работу.
SAOPP, чем лучше и практичнее будет выглядеть эта операция?
Во-первых тем что это быстрее, а во-вторых я подозреваю разработчики AutoIt вскоре совсем откажутся от Opt("WinTitleMatchMode", X)... и тогда придётся переделывать все наши скрипты которые использовали этот метод.
TERMINAL
24-09-2007, 13:50
Creat0R, Спасибо огромное (правда ещё не проверял, но верю). Пока ты мне помогал, то я написал одну прогу-может кому-то и пригодится... Суть вот в чём... Я Админ и у меня все работают в 1С, но есть удалённая точка которую нужно тоже контролировать (когда на работу пришёл, когда ушёл...), инет не всегда есть-поэтому можно отмазаться тому человеку. Каждый день я с ним обмениваюсь папкой для 1С ну и решил запустить такую прогу, которая будет сама стартовать и делать мне отчёт...
Local $Den = @MDAY
Local $Mesyac = @MON
Local $God = @YEAR
Local $4as = @HOUR
Local $Minute = @MIN
Global $1C="1cv7.exe"
IniWrite ( @HomeDrive & "\Пакет\Time.ini", "Запуск компа ", "Включение " & $Den & "." & $Mesyac & "." & $God , " " & $4as & "." & $Minute)
FileSetAttrib ( @HomeDrive & "\Пакет\Time.ini","+H" )
For $i = 1 To 1000
If ProcessWait ($1C) Then
Local $Den1 = @MDAY
Local $Mesyac1 = @MON
Local $God1 = @YEAR
Local $4as1 = @HOUR
Local $Minute1 = @MIN
IniWrite ( @HomeDrive & "\Пакет\Time.ini", "1C", "Запуск программы 1С " & $i & " " & $Den1 & "." & $Mesyac1 & "." & $God1 , " " & $4as1 & "." & $Minute1)
ProcessWaitClose ($1C)
Local $Den2 = @MDAY
Local $Mesyac2 = @MON
Local $God2 = @YEAR
Local $4as2 = @HOUR
Local $Minute2 = @MIN
IniWrite ( @HomeDrive & "\Пакет\Time.ini", "1C", "Выход с программы 1С " & $i & " " & $Den2 & "." & $Mesyac2 & "." & $God2 , " " & $4as2 & "." & $Minute2)
EndIf
Next
Creat0R,
У меня встречный вопрос (и просьба если это осуществимо), можно ли сделать как предлагаете вы, только вот меня интересует следующее, можно ли заставить курсор "щёлкать" (входить в меню панели задач) на часах Windows а не на всей панели конкретно?
Если это осуществимо, решается вопрос о "загрязнённой" панели задач открытыми окнами - это когда места нету на панели задач свободного, а открыты приложения/окна занимающее всё пустое место, таким образом AutoIt щёлкает на любом окне и не выполняет поставленную задачу :(
SAOPP,
можно ли заставить курсор "щёлкать" (входить в меню панели задач) на часах Windows а не на всей панели конкретно?
Можно полагаю...
ControlClick("[Class:Shell_TrayWnd]", "", "TrayClockWClass1", "Right")
:)
Опаньки, к сожалению я не приложу ума к этому, а продолжения в виде опуститься один раз вниз или как вы писал ранее для того, что бы не бегать 10 раз вверх, плюс там выбрать 4ю позицию:
http://img255.imageshack.us/img255/36/54834129ln3.png
SAOPP,
Если я правильно понял, то вот:
$TrayTitle = "[CLASS:Shell_TrayWnd]"
ControlClick($TrayTitle, "", "TrayClockWClass1", "Right")
Send("{DOWN}")
Send("{ENTER}")
Send("{DOWN 2}")
Send("{ENTER}")
Благодарю. Огромное спасибо - теперь "проблема" как таковая решена вообще :)
Нет ли у кого примера скрипта как убрать иконку из tray в винде при загрузке и не показывать ее до следующей перезагрузки
Maza Faka
25-09-2007, 14:00
adima
Какую иконку, какого приложения?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.