Что нового

Запуск скрипта

happyboy

Новичок
Сообщения
9
Репутация
0
Надоело пол дня чувствовать себя ущербом, решил все-таки попросить помощи, сам ответа не нашел, не ругайтесь. В общем решил создать скрипт, что бы нажимая ф1 начинал работать скрипт, в одном окне в котором работаю нажималась клавиша ф10, далее переключалось на второе окно там нажимало на ф11 и переключалось на первое обратно, у меня так получилось:

HotKeySet("{F1}")
WinWait("LineageII ","")
If Not WinActive("LineageII ","") Then WinActivate("LineageII ","")
WinWaitActive("LineageII ","")
Send("{F10}{ALTDOWN}{TAB}{ALTUP}{F11}{ALTDOWN}{TAB}{ALTUP}")

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

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
happyboy
Вот Вам пример с блокнотами
Код:
Global $fPause = False, $fWin = False, $iCount_1 = 0, $iCount_2 = 0, $hWin_1, $hWin_2

HotKeySet('{Esc}', '_Exit')
HotKeySet('{F11}', '_Pause_Not_Pause')

Run('Notepad.exe')
Run('Notepad.exe')
WinWait('[Class:Notepad]', '', 3)
$aList = WinList('[Class:Notepad]')
If IsArray($aList) And $aList[0][0] >= 2 Then
	$hWin_1 = $aList[1][1]
	$hWin_2 = $aList[2][1]
EndIf
If Not $hWin_1 Or Not $hWin_2 Then
	MsgBox(16, 'Error', 'Нет блокнотов.')
	Exit
EndIf
WinMove($hWin_1, '', 10, 10)
WinMove($hWin_2, '', 200, 200)
While 1
	If $fPause Then
		ToolTip('Работаем. Для паузы нажмите F11.' & @LF & 'Esc - выход.', 0, 0)
		$fWin = Not $fWin
		If $fWin Then
			$iCount_1 += 1
			WinActivate($hWin_1)
			ControlSend($hWin_1, '', 'Edit1', 'Первый блокнот' & @TAB & $iCount_1 & @CRLF)
			Sleep(500)
		Else
			$iCount_2 += 1
			WinActivate($hWin_2)
			ControlSend($hWin_2, '', 'Edit1', 'Второй блокнот' & @TAB & $iCount_2 & @CRLF)
			Sleep(500)
		EndIf
	Else
		WinSetState($hWin_1, '', @SW_MINIMIZE)
		WinSetState($hWin_2, '', @SW_MINIMIZE)
		ToolTip('Пауза. Для начала работы нажмите F11.' & @LF & 'Esc - выход.', 0, 0)
		$iCount = 0
	EndIf
	If Not WinExists($hWin_1) Or Not WinExists($hWin_2) Then
		MsgBox(16, 'Error', 'Нет блокнотов.')
		Exit
	EndIf
	Sleep(20)
WEnd

Func _Pause_Not_Pause()
	$fPause = Not $fPause
EndFunc   ;==>_Pause_Not_Pause

Func _Exit()
	;WinKill($hWin_1)
	;WinKill($hWin_2)
	Exit
EndFunc   ;==>_Exit
 
Автор
H

happyboy

Новичок
Сообщения
9
Репутация
0
qsort сказал(а):
Все, что понял, так это что "надоело чувствовать себя ущербом", что при нике happyboy несколько странно. Что надо-таки, не совсем понятно. Что вижу:
В первой строке не делается ничего.
Во второй строке ожидается окно с заголовком "LineageII " (видимо, откуда-то оно должно появиться).
Третья строка: проверяется активность окна с заголовком "LineageII ", и если оно не активно, делается попытка его активизировать.
Четвертая строка: ожидается, когда, наконец, окно с заголовком "LineageII " активизируется.
Пятая строка: какая-то явно некорректная последовательность нажимаемых клавиш.
Вот и все, что видно. Хотя бы словами-то, можно определить, чего, все-таки, надо...
Внешне ошибок нет.
Скрипт работает. Я не могу понять, как назначить на него горячую клавишу, которая запускала бы его, когда открыто окно игры.


Добавлено:
Сообщение автоматически объединено:

madmasles сказал(а):
happyboy
Вот Вам пример с блокнотами
Код:
Global $fPause = False, $fWin = False, $iCount_1 = 0, $iCount_2 = 0, $hWin_1, $hWin_2

HotKeySet('{Esc}', '_Exit')
HotKeySet('{F11}', '_Pause_Not_Pause')

Run('Notepad.exe')
Run('Notepad.exe')
WinWait('[Class:Notepad]', '', 3)
$aList = WinList('[Class:Notepad]')
If IsArray($aList) And $aList[0][0] >= 2 Then
	$hWin_1 = $aList[1][1]
	$hWin_2 = $aList[2][1]
EndIf
If Not $hWin_1 Or Not $hWin_2 Then
	MsgBox(16, 'Error', 'Нет блокнотов.')
	Exit
EndIf
WinMove($hWin_1, '', 10, 10)
WinMove($hWin_2, '', 200, 200)
While 1
	If $fPause Then
		ToolTip('Работаем. Для паузы нажмите F11.' & @LF & 'Esc - выход.', 0, 0)
		$fWin = Not $fWin
		If $fWin Then
			$iCount_1 += 1
			WinActivate($hWin_1)
			ControlSend($hWin_1, '', 'Edit1', 'Первый блокнот' & @TAB & $iCount_1 & @CRLF)
			Sleep(500)
		Else
			$iCount_2 += 1
			WinActivate($hWin_2)
			ControlSend($hWin_2, '', 'Edit1', 'Второй блокнот' & @TAB & $iCount_2 & @CRLF)
			Sleep(500)
		EndIf
	Else
		WinSetState($hWin_1, '', @SW_MINIMIZE)
		WinSetState($hWin_2, '', @SW_MINIMIZE)
		ToolTip('Пауза. Для начала работы нажмите F11.' & @LF & 'Esc - выход.', 0, 0)
		$iCount = 0
	EndIf
	If Not WinExists($hWin_1) Or Not WinExists($hWin_2) Then
		MsgBox(16, 'Error', 'Нет блокнотов.')
		Exit
	EndIf
	Sleep(20)
WEnd

Func _Pause_Not_Pause()
	$fPause = Not $fPause
EndFunc   ;==>_Pause_Not_Pause

Func _Exit()
	;WinKill($hWin_1)
	;WinKill($hWin_2)
	Exit
EndFunc   ;==>_Exit

не понял, но буду пробоваразобраться, спасибо))


Добавлено:
Сообщение автоматически объединено:

конечно можно нажимать быстро, последовательно, сначало кнопку винды, потом кнопку быстрого вызова, какую назначу, на ярлыке к скрипту, что бы скрипт запускался, но мне кажется это все делается проще, я просто не могу понять как именно))
 
Автор
H

happyboy

Новичок
Сообщения
9
Репутация
0
скрипт запущен, но при нажатии на ф1 не в винде, не в окне программы ничего не происходит.. Возможно проблема в винде, антивирусе или в чем-нибудь еще?


Добавлено:
Сообщение автоматически объединено:

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

svigelf

Знающий
Сообщения
61
Репутация
17
проблема в том, что клавиши слишком быстро нажимаются и в запущеных приложениях, которые висят на алть - таб .. тоесть 2 окна Lineage II разбросаны в перемешку с другими приложениями...и им еще нужно время, чтобы открыться..

экспериментируй с временем, у меня покрайней мере получилось нажать F10 , а на 2ое окно не переключилось

- это совсем лишняя функция, как мне кажется ( так, как оба окна имеют одинаковый заголовок) да и самому можно открыть нужное окно
Код:
WinWait("LineageII ","")
If Not WinActive("LineageII ","") Then WinActivate("LineageII ","")
 
Автор
H

happyboy

Новичок
Сообщения
9
Репутация
0
последовательность правильная, комп шустрый, все успевает, окна не в перемешку с другими. при клацанье на изначальный скрипт без указания горячей клавиши, с рабочего стола, скрипт делает все что надо, но в случии переделанного скрипта под горячую клафишу ф1, после его запуска(в трее его видно, видно что он запущен) при нажатии на ф1 ничего не происходит... вот в чем проблема.. вернее не понятно в чем)))
 

svigelf

Знающий
Сообщения
61
Репутация
17
Чтото вроде Этого:

Код:
DllCall("kernel32.dll", "int", "Wow64DisableWow64FsRedirection", "int", 1)
#RequireAdmin
#include <GUIConstants.au3>

GUICreate("Lineage ACP")
GUISetState (@SW_SHOW)

HotKeySet("{F1}", "On")

Func On()

	Send("{F10}")

	Send("{ALTDOWN}{TAB}{ALTUP}")
	Sleep (500)
	Send("{F11}")

	Send("{ALTDOWN}{TAB}{ALTUP}")
	Sleep (500)
EndFunc


While 1
    $msg = GUIGetMsg()

    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
Wend

С временем поэкспериментировать нужно конечно))
 
Автор
H

happyboy

Новичок
Сообщения
9
Репутация
0
о, а это работает, даже после удаление слипа, в чем проблема то была объясните пожалуйста?)
 

svigelf

Знающий
Сообщения
61
Репутация
17
в том, что GUI окно висит... (в том случае ждет, пока ты его не закроешь)

Код:
#include <GUIConstants.au3>

GUICreate("Lineage ACP")
GUISetState (@SW_SHOW)

можно еще поставить вместо:
GUISetState (@SW_SHOW)
это :
GUISetState (@SW_HIDE)

чтобы не висело окошко на виду и не мешалось
 
Автор
H

happyboy

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

svigelf

Знающий
Сообщения
61
Репутация
17
чтобы переключатся без альт таба тебе надо какимто образом уметь различать 2 окна..и чтобы скрипт знал что 1ое окно это действительно первое..

ну или по процессам)

(папки не нужны)

Код:
;для первого окна(когда 2ое не запущено выставляем имя окна "1 Lineage II")
WinSetTitle("Lineage II", "", "1 Lineage II")
;когда первое уже переименовано, запускаем 2ое и также с ним делаем
WinSetTitle("Lineage II", "", "2 Lineage II")
;ну а потом их активировать этим образом:
WinActivate("1 Lineage II")
WinActivate("2 Lineage II")



Добавлено:
Сообщение автоматически объединено:

я думаю так:

пишем мини программку(для переименования окна)
Код:
While 1
WinSetTitle("Lineage II", "", "1 Lineage II")
WEnd


затем в основном скрипте реализовать, что при запуске основного скрипта из него выходила эта прога и ждала , пока на F1 клацнут, затем она запускается и держит первое окно с другим названием (получается - 1 Lineage II)

Код:
DllCall("kernel32.dll", "int", "Wow64DisableWow64FsRedirection", "int", 1)
#RequireAdmin
#include <GUIConstants.au3>

GUICreate("Lineage ACP")
GUISetState (@SW_HIDE)

FileInstall("C:\1.exe", @ScriptDir & "\1.exe")

HotKeySet("{F1}", "On")

Func On()
	Run (@ScriptDir & "\1.exe")
              Sleep (20) ; на своей машине подогнать (чтобы успела переименовать)
              ;тут вызываем окно 1 Lineage II(основное)
	Send("{F10}")

	;Send("{ALTDOWN}{TAB}{ALTUP}")
	;тут вызываем окно Lineage II(не основное)
	Sleep (2000)
	Send("{F11}")

	;Send("{ALTDOWN}{TAB}{ALTUP}")
	;тут вызываем окно 1 Lineage II(основное)
	Sleep (500)
EndFunc


While 1
    $msg = GUIGetMsg()

    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
Wend
 
Автор
H

happyboy

Новичок
Сообщения
9
Репутация
0
Не очень понял))
В общем ладно, я в принципе что хотел узнал, пусть активируются, это уже не принципиально, ибо комп сильный, вопрос другой, мне придется сделать скриптов 10, для каждого скрипта мне надо будет назначить горячие клавиши, не хочется запускать по 10 скриптов, а что бы это все работало при включенном одном, я так понимаю это должно выглядеть примерно так?:

Код:
DllCall("kernel32.dll", "int", "Wow64DisableWow64FsRedirection", "int", 1)
#RequireAdmin
#include <GUIConstants.au3>

GUICreate("Lineage ACP")
GUISetState (@SW_HIDE)

HotKeySet("{F1}", "On")

Func On()
    Send("{F10}")
    Send("{ALTDOWN}{TAB}{ALTUP}")
    Send("{F11}")
    Send("{ALTDOWN}{TAB}{ALTUP}")
EndFunc

HotKeySet("{F2}", "On")

Func On()
    Send("{F9}")
    Send("{ALTDOWN}{TAB}{ALTUP}")
    Send("{F10}")
    Send("{ALTDOWN}{TAB}{ALTUP}")
EndFunc


While 1
    $msg = GUIGetMsg()

    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
Wend
 

svigelf

Знающий
Сообщения
61
Репутация
17
у тебя там названия функций повторяется...

две функции
Код:
Func On()


Код:
DllCall("kernel32.dll", "int", "Wow64DisableWow64FsRedirection", "int", 1)
#RequireAdmin
#include <GUIConstants.au3>

GUICreate("Lineage ACP")
GUISetState (@SW_HIDE)

HotKeySet("{F1}", "On")

Func On()
    Send("{F10}")
    Send("{ALTDOWN}{TAB}{ALTUP}")
    Send("{F11}")
    Send("{ALTDOWN}{TAB}{ALTUP}")
EndFunc

HotKeySet("{F2}", "On2")

Func On2()
    Send("{F9}")
    Send("{ALTDOWN}{TAB}{ALTUP}")
    Send("{F10}")
    Send("{ALTDOWN}{TAB}{ALTUP}")
EndFunc


While 1
    $msg = GUIGetMsg()

    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
Wend

но будет одна проблема...при быстром нажатии F1 и F2 скрипт будет путаться...тебе придется его оптимизировать...а как именно решать тебе)
 
Автор
H

happyboy

Новичок
Сообщения
9
Репутация
0
понял, собственно это то, что мне и надо было узнать, тема решена, но прошу не закрывать, если что, буду в ней продолжать спрашивать. Большое спасибо за помощь! :ok:


Добавлено:
Сообщение автоматически объединено:

я буду нажимать ф2 только когда ф1 будет проиграно, думаю все будет норм) посмотрим)


Добавлено:
Сообщение автоматически объединено:

и слипы небольшые все же придется я смотрю добавить
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
happyboy [?]
если что, буду в ней продолжать спрашивать
А вот это не надо, ты и так развёл тут оффтоп (я уже молчу про название темы).

{MultplQuestionWarn.Admin}
 
Верх