Ajuda com ordem de ações

Tire suas dúvidas sobre programação em AutoHotkey

Moderator: Gio

gaby1337
Posts: 25
Joined: 07 Jan 2020, 19:26

Ajuda com ordem de ações

23 Mar 2020, 22:18

Estou fazendo um script com PixelSearch e ImageSearch e queria saber se tem como fazer o script esperar por um pixel antes de continuar realizando um loop

Code: Select all

on:=true
while on
{
;AÇÃO 1
CoordMode, Pixel, Window
PixelSearch, FoundX, FoundY, 5, 5, 15, 15, 0xF9F9F9, 0, Fast RGB
If ErrorLevel = 0
{
	IfWinNotExist, Notepad - Notepad
	{
		Click Left, 700, 360
		Sleep, 1000
		Click Left, 90, 310
		Sleep, 2000
		Send %CONTEUDO_DO_ARQUIVO_1%
		Sleep, 2000
		Send, {tab}
		Sleep, 2000
		Send %CONTEUDO_DO_ARQUIVO_2%
		Sleep, 2000
		Send, {enter}
		Sleep, 8000
		Click Left, 650, 350
		Sleep, 1000
		
		;AGORA EU PRECISO FAZER COM QUE O SCRIPT ESPERE PELO PÍXEL ABAIXO, PARA DEPOIS REALIZAR A FUNÇÃO DE TEXTO_CONFIRMADO
		;AÇÃO 2
		CoordMode, Pixel, Window
		PixelSearch, FoundX, FoundY, 5, 5, 15, 15, 0xF9F9F9 , 0, Fast RGB		;ESSE PIXEL PRECISA SER ENCONTRADO ANTES DO SCRIPT REALIZAR A AÇÃO 3
		If ErrorLevel = 0
		{
			ImageSearch, foundX, foundY, 0, 0, %A_ScreenWidth%, %A_ScreenHeight%, %30%
			If(ErrorLevel == 0)
			{
				TEXTO_CONFIRMADO := 1
			}
			else
			{
				TEXTO_CONFIRMADO := 2
			}
		}
	}
	;AÇÃO 3
	Soundbeep, 500, 500
}
}
Como o loop do AHK não para de realizar as funções do script, é provável que a AÇÃO 3 (Soundbeep), seja realizada antes da AÇÃO 2 (PixelSearch), isso porque o pixel que eu especifiquei, demora alguns segundos para aparecer, porém, como não são segundos muito precisos, é praticamente impossível eu usar o Sleep, pois o tempo varia muito. Em resumo, eu preciso que a AÇÃO 2 seja realizada antes da AÇÃO 3, eu pensei em um método onde o script esperasse por um pixel específico (tipo um PixelWait), mas não achei nada assim na documentação do AHK. Como posso fazer?
User avatar
Gio
Posts: 865
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Ajuda com ordem de ações

24 Mar 2020, 11:10

Bom dia Gaby1337.
Em resumo, eu preciso que a AÇÃO 2 seja realizada antes da AÇÃO 3
Se você quer que a "ação 3" aconteça somente após a "ação 2", você tem uma situação onde existe uma condição para a "ação 3". Logo, você precisa de uma condicional (if) para controlar isso.

Mas como já existe uma condicional para a "ação 2", porque não colocar a rotina da "ação 3" dentro dessa mesma condicional?

Code: Select all

on:=true
while on
{
;AÇÃO 1
CoordMode, Pixel, Window
PixelSearch, FoundX, FoundY, 5, 5, 15, 15, 0xF9F9F9, 0, Fast RGB
If ErrorLevel = 0
{
	IfWinNotExist, Notepad - Notepad
	{
		Click Left, 700, 360
		Sleep, 1000
		Click Left, 90, 310
		Sleep, 2000
		Send %CONTEUDO_DO_ARQUIVO_1%
		Sleep, 2000
		Send, {tab}
		Sleep, 2000
		Send %CONTEUDO_DO_ARQUIVO_2%
		Sleep, 2000
		Send, {enter}
		Sleep, 8000
		Click Left, 650, 350
		Sleep, 1000
		
		;AGORA EU PRECISO FAZER COM QUE O SCRIPT ESPERE PELO PÍXEL ABAIXO, PARA DEPOIS REALIZAR A FUNÇÃO DE TEXTO_CONFIRMADO
		;AÇÃO 2
		CoordMode, Pixel, Window
		PixelSearch, FoundX, FoundY, 5, 5, 15, 15, 0xF9F9F9 , 0, Fast RGB		;ESSE PIXEL PRECISA SER ENCONTRADO ANTES DO SCRIPT REALIZAR A AÇÃO 3
		If ErrorLevel = 0
		{
			ImageSearch, foundX, foundY, 0, 0, %A_ScreenWidth%, %A_ScreenHeight%, %30%
			If(ErrorLevel == 0)
			{
				TEXTO_CONFIRMADO := 1
			}
			else
			{
				TEXTO_CONFIRMADO := 2
			}
			;AÇÃO 3
			Soundbeep, 500, 500
		}
	}
}
}
:arrow: Veja no código acima como coloquei o código da "ação 3" dentro do próprio bloco condicionado ao encontrar do pixel (ação 2). Isso faz com que o código da "ação 3" só ocorra se o pixel for encontrado (o que garantimos pela condicional que checa a variável ErrorLevel logo após o comando PixelSearch).


Espero que tenha ficado claro, se ainda tiver alguma dúvida, basta perguntar abaixo.
gaby1337
Posts: 25
Joined: 07 Jan 2020, 19:26

Re: Ajuda com ordem de ações

24 Mar 2020, 23:54

Só mais uma dúvida: eu uso um PixelSearch pra detectar a tela de login pro script poder logar na minha conta, porém eu preciso que ele logue nela apenas uma vez, depois que estiver logada, eu preciso que o script emita um sinal para não realizar o PixelSearch na tela de login de novo.

Code: Select all

;O QUE EU PRECISO COLOCAR AQUI PRA QUE O PIXELSEARCH ABAIXO SÓ SEJA REALIZADO UMA VEZ? CONSIDERANDO QUE EU JÁ EMITI UM *SINAL DE CONTA LOGADA*
CoordMode, Pixel, Window
PixelSearch, FoundX, FoundY, 5, 5, 15, 15, 0xF9F9F9, 0, Fast RGB
If ErrorLevel = 0
{
	Click Left, 90, 310					;USER
	Sleep, 2000
	Send %CONTEUDO_DO_ARQUIVO_1%
	Sleep, 2000
	Send, {tab}							;PASSWORD
	Sleep, 2000
	Send %CONTEUDO_DO_ARQUIVO_2%
	Sleep, 2000
	Send, {enter}
	CONTA_1 := LOGADA					;*SINAL DE CONTA LOGADA*
}
O sinal CONTA_1 := LOGADA, serve pro script saber que a primeira conta já foi, porém, se o script achar o pixel de novo, ele fará exatamente a mesma coisa, como faz pra parar depois que o script já emitiu o sinal de conta logada?
User avatar
Gio
Posts: 865
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Ajuda com ordem de ações

25 Mar 2020, 09:52

Bom dia Gaby1337.

Vejo que você já adicionou uma variável para controle do estado. Assim que a rotina rodar até o final, a variável CONTA_1 vai receber um valor. Mas no momento o valor que está sendo colocado é um valor nulo (em branco) porque você está usando o operado := (de expressões) e a variável LOGADA não parece conter nenhum valor.

Sugiro colocar o valor 1 na variável CONTA_1 ao final da rotina.

Depois disso, você pode condicionar a rotina inteira ao valor da variável CONTA_1 NÃO SER igual a 1.

Code: Select all

If (CONTA_1 != 1) ; SE O VALOR DA VARIÁVEL CONTA_1 NÃO FOR IGUAL A 1...
{
	;EXECUTA A ROTINA
	CoordMode, Pixel, Window
	PixelSearch, FoundX, FoundY, 5, 5, 15, 15, 0xF9F9F9, 0, Fast RGB
	If ErrorLevel = 0
	{
		Click Left, 90, 310				
		Sleep, 2000
		Send %CONTEUDO_DO_ARQUIVO_1%
		Sleep, 2000
		Send, {tab}
		Sleep, 2000
		Send %CONTEUDO_DO_ARQUIVO_2%
		Sleep, 2000
		Send, {enter}
		CONTA_1 := 1		; E NO FINAL COLOCA O VALOR DA VARIÁVEL EM 1 QUANDO TERMINAR (O QUE SIGNIFICA QUE ESSA ROTINA NÃO RODARÁ DE NOVO NA MESMA EXECUÇÃO DESSE SCRIPT.
	}
}
gaby1337
Posts: 25
Joined: 07 Jan 2020, 19:26

Re: Ajuda com ordem de ações

26 Mar 2020, 03:20

Obrigada @Gio, pelo que eu entendi, o valor das variáveis devem ser apenas números, certo?

Por exemplo:

✔ CONTA_1 := 1

✖ CONTA_1 := LOGADA
User avatar
Gio
Posts: 865
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Ajuda com ordem de ações

26 Mar 2020, 09:31

Bom dia Gaby1337.

Você PODE usar literais em variáveis de checagem de estado, a questão é que a sintaxe do operador := é uma sintaxe de expressão matemática.

Por este motivo, quando você escreveu CONTA_1 := LOGADA, o conteúdo da variável LOGADA é que seria escrito em CONTA_1. Mas como essa variável está vazia, nada foi escrito em CONTA_1 no código original.

O exemplo abaixo demonstra como você usaria literais na variável de checagem para o mesmo código proposto acima.

Code: Select all

If (CONTA_1 != "LOGADA") ; SE O VALOR DA VARIÁVEL CONTA_1 NÃO FOR IGUAL A "LOGADA"...
{
	;EXECUTA A ROTINA
	CoordMode, Pixel, Window
	PixelSearch, FoundX, FoundY, 5, 5, 15, 15, 0xF9F9F9, 0, Fast RGB
	If ErrorLevel = 0
	{
		Click Left, 90, 310				
		Sleep, 2000
		Send %CONTEUDO_DO_ARQUIVO_1%
		Sleep, 2000
		Send, {tab}
		Sleep, 2000
		Send %CONTEUDO_DO_ARQUIVO_2%
		Sleep, 2000
		Send, {enter}
		CONTA_1 := "LOGADA"		; E NO FINAL COLOCA O VALOR DA VARIÁVEL EM "LOGADA" QUANDO TERMINAR (O QUE SIGNIFICA QUE ESSA ROTINA NÃO RODARÁ DE NOVO NA MESMA EXECUÇÃO DESSE SCRIPT.
	}
}

Return to “Ajuda e Suporte Geral”

Who is online

Users browsing this forum: Gio and 28 guests