Executar um script que está dentro de uma var Topic is solved

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

Moderator: Gio

User avatar
juanmuscaria
Posts: 65
Joined: 29 Oct 2017, 10:53
Location: Brazil
Contact:

Executar um script que está dentro de uma var

16 Jul 2018, 09:56

É possível executar um script contido dentro de uma variável?
ex: Script = Msgbox Olá`nVar1 = 1`nMsgbox %Var1%
User avatar
Gio
Posts: 1247
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Executar um script que está dentro de uma var  Topic is solved

16 Jul 2018, 11:03

Bom dia Juanmuscaria.

Não é possível fazer isso diretamente, mas há várias maneiras de conseguir um resultado semelhante, com variados níveis de sucesso e trabalho. Você pode, por exemplo:
  • 1. Escrever um script secundário de AutoHotkey (usando FileAppend) com o código escrito na variável, e depois simplesmente executá-lo (Run).
  • 2. Outra possibilidade é usar o AutoHotkey.dll (AutoHotkey_H). Assim, você faria um DllCall() de dentro do script e passaria o código a ser executado.
  • 3. Uma terceira hipótese é criar um script interpretador, procurando os nomes dos comandos e executando os comandos relativos. Este último caso daria muito trabalho se você precisar que o script interno execute todo e qualquer comando possível, mas é relativamente simples de fazer se são poucos os comandos que devem ser repassados dessa forma.
  • 4. Tem uma função antiga escrita pelo HotkeyIt chamado DynaRun(). Ao longo dos anos ela se tornou um comando da versão 2 do AutoHotkey_H, mas a função antiga ainda existe. Testei o código abaixo e tive resultados bons (o único efeito colateral foi a perda dos acentos). Executou quatro linhas de código e dois comandos diferentes escritos dentro da variável var:

Code: Select all

#Persistent
Var =
(
msgbox Essa mensagem será exibida dentro do msgbox
inputbox, var, escreva algo, escreva abaixo e será enviado à uma msgbox
msgbox `%var`%
msgbox fim do script
)
DynaRun(Var)


Return
DynaRun(TempScript, pipename="")
{
   static _:="uint",@:="Ptr"
   If pipename =
      name := "AHK" A_TickCount
   Else
      name := pipename
   __PIPE_GA_ := DllCall("CreateNamedPipe","str","\\.\pipe\" name,_,2,_,0,_,255,_,0,_,0,@,0,@,0)
   __PIPE_    := DllCall("CreateNamedPipe","str","\\.\pipe\" name,_,2,_,0,_,255,_,0,_,0,@,0,@,0)
   if (__PIPE_=-1 or __PIPE_GA_=-1)
      Return 0
   Run, %A_AhkPath% "\\.\pipe\%name%",,UseErrorLevel HIDE, PID
   If ErrorLevel
      MsgBox, 262144, ERROR,% "Could not open file:`n" __AHK_EXE_ """\\.\pipe\" name """"
   DllCall("ConnectNamedPipe",@,__PIPE_GA_,@,0)
   DllCall("CloseHandle",@,__PIPE_GA_)
   DllCall("ConnectNamedPipe",@,__PIPE_,@,0)
   script := (A_IsUnicode ? chr(0xfeff) : (chr(239) . chr(187) . chr(191))) TempScript
   if !DllCall("WriteFile",@,__PIPE_,"str",script,_,(StrLen(script)+1)*(A_IsUnicode ? 2 : 1),_ "*",0,@,0)
        Return A_LastError,DllCall("CloseHandle",@,__PIPE_)
   DllCall("CloseHandle",@,__PIPE_)
   Return PID
}
Se você observar o código, verá que o script acima cria um pipe nomeado com os comandos escritos e executa-o usando o executável do AutoHotkey. É uma estratégia interessante.

Outro ponto interessante: veja a sintaxe de expressão literal que utilizei para escrever as linhas na variável Var. Costumo usar essa sintaxe sempre que preciso escrever várias linhas literais, pois ela permite escrever com enter ao invés de `n (portanto, organiza melhor).

Return to “Ajuda e Suporte Geral”

Who is online

Users browsing this forum: No registered users and 25 guests