Jump to content

Luigi

Administradores (Adm)
  • Content count

    690
  • Joined

  • Last visited

  • Days Won

    143

Everything posted by Luigi

  1. Autoit Frontend

    Bom trabalho @Pedro Pinheiro, achei bem legal ter usado IrrLicht e compartilhar no GitHub!
  2. @Belini, Minha contribuição. #include <Array.au3> Local $numeros[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40] Local $combinacoes = 6 Local $combo = _ArrayCombinations($numeros, $combinacoes, ",") For $ii = 1 To UBound($combo, 1) - 1 Step $combinacoes For $jj = 0 To $combinacoes - 1 ConsoleWrite("[" & $ii & "]=" & $combo[$jj + $ii] & @LF) Next Next Obs: tente um um array pequeno... pois com 40 números... demora muitoooooo.
  3. A explicação do @Manimal é completa. Apenas a título de curiosidade, existe uma mega-power-ultra-fodástica ferramenta, CyberArk, que atua no seguimento de segurança corporativo, fazendo a troca de senhas e muitas outras coisas... E a linguagem que faz todas as automações por trás do CyberArk é... Tharám... A-U-T-O-I-T! @Fui...
  4. @Belini Segue minhas sugestões: Sugestão 1: ;~ http://www.autoitbrasil.com/forum/index.php?/topic/2177-hotkeyset-chamar-fun%C3%A7%C3%A3o-apenas-uma-vez/ #include <Misc.au3> Global $hDLL = DllOpen("user32.dll") Global $aKeys[][4] = [ _ [2], _ [10, False, "ShiftOn", "ShiftOff"], _ [11, False, "CtrlOn", "CtrlOff"] _ ] While Sleep(10) For $ii = 1 To $aKeys[0][0] If _IsPressed($aKeys[$ii][0], $hDLL) And Not $aKeys[$ii][1] Then Call($aKeys[$ii][2]) $aKeys[$ii][1] = True ElseIf Not _IsPressed($aKeys[$ii][0], $hDLL) And $aKeys[$ii][1] Then Call($aKeys[$ii][3]) $aKeys[$ii][1] = False EndIf Next WEnd Func ShiftOn() ConsoleWrite("Shift On!" & @LF) EndFunc ;==>ShiftOn Func ShiftOff() ConsoleWrite("Shift Off!" & @LF) EndFunc ;==>ShiftOff Func CtrlOn() ConsoleWrite("Ctrl On!" & @LF) EndFunc ;==>ShiftOn Func CtrlOff() ConsoleWrite("Ctrl Off!" & @LF) EndFunc ;==>ShiftOff DllClose($hDLL) Sugestão 2: ;~ http://www.autoitbrasil.com/forum/index.php?/topic/2177-hotkeyset-chamar-fun%C3%A7%C3%A3o-apenas-uma-vez/ #include <Misc.au3> #include <MsgBoxConstants.au3> Global $hDLL = DllOpen("user32.dll") Global $aKeys[][4] = [ _ [2], _ [10, False, ShiftOn, ShiftOff], _ [11, False, CtrlOn, CtrlOff] _ ] While Sleep(10) For $ii = 1 To $aKeys[0][0] If _IsPressed($aKeys[$ii][0], $hDLL) And Not $aKeys[$ii][1] Then $aKeys[$ii][2]() $aKeys[$ii][1] = True ElseIf Not _IsPressed($aKeys[$ii][0], $hDLL) And $aKeys[$ii][1] Then $aKeys[$ii][3]() $aKeys[$ii][1] = False EndIf Next WEnd Func ShiftOn() ConsoleWrite("Shift On!" & @LF) EndFunc ;==>ShiftOn Func ShiftOff() ConsoleWrite("Shift Off!" & @LF) EndFunc ;==>ShiftOff Func CtrlOn() ConsoleWrite("Ctrl On!" & @LF) EndFunc ;==>ShiftOn Func CtrlOff() ConsoleWrite("Ctrl Off!" & @LF) EndFunc ;==>ShiftOff DllClose($hDLL) Sugestão 3: ;~ http://www.autoitbrasil.com/forum/index.php?/topic/2177-hotkeyset-chamar-fun%C3%A7%C3%A3o-apenas-uma-vez/ #include <Misc.au3> Global $hDLL = DllOpen("user32.dll") Global $aKeys[][4] = [ _ [2], _ [10, False, ShiftOn, ShiftOff], _ [11, False, CtrlOn, CtrlOff] _ ] While Sleep(10) For $ii = 1 To $aKeys[0][0] If _IsPressed($aKeys[$ii][0], $hDLL) And Not $aKeys[$ii][1] Then $aKeys[$ii][1] = $aKeys[$ii][2]() ElseIf Not _IsPressed($aKeys[$ii][0], $hDLL) And $aKeys[$ii][1] Then $aKeys[$ii][1] = $aKeys[$ii][3]() EndIf Next WEnd Func ShiftOn() ConsoleWrite("Shift On!" & @LF) Return True EndFunc ;==>ShiftOn Func ShiftOff() ConsoleWrite("Shift Off!" & @LF) Return False EndFunc ;==>ShiftOff Func CtrlOn() ConsoleWrite("Ctrl On!" & @LF) Return True EndFunc ;==>ShiftOn Func CtrlOff() ConsoleWrite("Ctrl Off!" & @LF) Return False EndFunc ;==>ShiftOff DllClose($hDLL) Sugestão 4: ;~ http://www.autoitbrasil.com/forum/index.php?/topic/2177-hotkeyset-chamar-fun%C3%A7%C3%A3o-apenas-uma-vez/ #include <Misc.au3> Global $hDLL = DllOpen("user32.dll") Global $aKeys[][3] = [ _ [2], _ [10, False, Shift], _ [11, False, Ctrl] _ ] While Sleep(10) For $ii = 1 To $aKeys[0][0] If _IsPressed($aKeys[$ii][0], $hDLL) And Not $aKeys[$ii][1] Then $aKeys[$ii][2]($ii) ElseIf Not _IsPressed($aKeys[$ii][0], $hDLL) And $aKeys[$ii][1] Then $aKeys[$ii][2]($ii) EndIf Next WEnd Func Shift($id) Switch $aKeys[$ii][1] Case True ConsoleWrite("Shift Off!" & @LF) Case False ConsoleWrite("Shift On!" & @LF) EndSwitch $aKeys[$id][1] = Not $aKeys[$id][1] EndFunc ;==>ShiftOn Func Ctrl($id) Switch $aKeys[$ii][1] Case True ConsoleWrite("Ctrl Off!" & @LF) Case False ConsoleWrite("Ctrl On!" & @LF) EndSwitch $aKeys[$id][1] = Not $aKeys[$id][1] EndFunc ;==>ShiftOn DllClose($hDLL)
  5. Seria isso @Belini ? #cs Test() Func Test() Local $treeview, $i, $letter[27] GUICreate("Treeview", 210, 420) $treeview = GUICtrlCreateTreeView(0, 0, 210, 420, BitOR($TVS_HASLINES, $TVS_SHOWSELALWAYS), $WS_EX_CLIENTEDGE) For $i = 1 To 26 $letter[$i] = StringUpper(Chr(64 + $i)) GUICtrlCreateTreeViewItem($letter[$i], $treeview) Next _GUICtrlTreeView_SelectItem($treeview, _GUICtrlTreeView_GetFirstItem($treeview)) GUISetState() While 1 For $i = 1 To 26 Send($letter[$i]); Não seleciona a linha quando envio a letra Sleep(100) Next WEnd EndFunc ;==>Te #CE ;~ #AutoIt3Wrapper_AU3Check_Parameters= -q -d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7 ;~ #Tidy_Parameters=/sf #include-once #include <Array.au3> #include <GUIConstantsEx.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <GuiTreeView.au3> OnAutoItExitRegister("OnExit") Opt("GUIOnEventMode", 1) Opt("GUIEventOptions", 1) Opt("MustDeclareVars", 1) Global $aGuiSize[2] = [800, 600] Global $sGuiTitle = "GuiTitle" Global $hGui Global $iTreeView Global $sLetter Global $iSearch, $hItem $hGui = GUICreate($sGuiTitle, $aGuiSize[0], $aGuiSize[1]) GUISetOnEvent($GUI_EVENT_CLOSE, "Quit") $iTreeView = GUICtrlCreateTreeView(10, 10, 210, 420, BitOR($TVS_HASLINES, $TVS_SHOWSELALWAYS), $WS_EX_CLIENTEDGE) For $ii = 1 To 26 $sLetter = StringUpper(Chr(64 + $ii)) GUICtrlCreateTreeViewItem($sLetter, $iTreeView) Next GUISetState(@SW_SHOW, $hGui) For $ii = 1 To 26 $sLetter = StringUpper(Chr(64 + $ii)) $iSearch = _GUICtrlTreeView_FindItem($iTreeView, $sLetter) If Not @error Then $hItem = _GUICtrlTreeView_GetItemHandle($iTreeView, $iSearch) _GUICtrlTreeView_SelectItem($iTreeView, $hItem, $TVGN_FIRSTVISIBLE) _GUICtrlTreeView_SetState($iTreeView, $hItem, $TVIS_SELECTED, True) EndIf Next While Sleep(25) WEnd Func OnExit() GUISetState($hGui, @SW_HIDE) GUIDelete($hGui) EndFunc ;==>OnExit Func Quit() Exit EndFunc ;==>Quit
  6. Este fim de semana tive tempo para investir em dois sonhos antigos: manipular LED & MOTOR. Achei uma ótima DLL que envia dados e lê seu estado, está em WEBGRAFIA. Deu pra fazer 2 scripts, um que manipula 8 leds e outro que controla 1 motor de passo de impressora. Controlando LEDS. O parte técnica para montar este circuito é exatamente o proposto no Rogercom. #include <WindowsConstants.au3> #include <Array.au3> #include <Misc.au3> #include <GUIConstantsEx.au3> #include <Misc.au3> #include <ButtonConstants.au3> #include <String.au3> ; WEBGRAFIA ; http://www.autoitscript.com/forum/topic/31708-parallel-port-control/ Global $DLLFileAndPath = 'inpout32.dll', $PortAddress = '0x278', $hMsg Global $hDLL = DllOpen('user32.dll') Global $canais = 8 Global $StatusRegisterAddress, $ControlRegisterAddress CalculateRegisterAddresses($PortAddress) If FileExists($DLLFileAndPath) = 0 Then MsgBox(0, 'Missing DLL File', 'Parallel Port Control DLL Missing at ' & $DLLFileAndPath & '. Cannot Continue.' & @CRLF & @CRLF & 'Download DLL from http://www.logix4u.net/inpout32.htm') _exit() EndIf Global $led[$canais], $ledState[$canais] For $xx = 0 To $canais - 1 $ledState[$xx] = 0 Next Global $hGui = GUICreate('lpt', 800, 300) HotKeySet("{ESC}", "_exit") For $xx = 0 To $canais - 1 $led[$xx] = GUICtrlCreateButton('', 10 + 60 * $xx, 10, 60, 60, $BS_NOTIFY) GUICtrlSetBkColor($led[$xx], 0x6F0202) Next Global $modo0 = GUICtrlCreateButton('Modo 01', 500, 10, 80, 20) Global $modo1 = GUICtrlCreateButton('Modo 02', 500, 30, 80, 20) Global $modo2 = GUICtrlCreateButton('Modo 03', 500, 50, 80, 20) Global $modo3 = GUICtrlCreateButton('Modo 04', 500, 70, 80, 20) ;Global $modo4 = GUICtrlCreateButton('Modo 05', 500, 90, 80, 20) Global $modo = 2 Global $jump = 0, $jumpDirection = 1 Global $delay = 150 Global $posicao = 0 Global $delayControl = GUICtrlCreateSlider(10, 110, 480, 20) Global $delayLabel = GUICtrlCreateButton('delay[' & $delay & ' ms]', 500, 110, 80, 20) GUICtrlSetData($delayControl, $delay / 10) $hSlider = GUICtrlGetHandle($delayControl) Global $controlFullRight = GUICtrlCreateButton('full right', 10, 150, 80, 20) Global $controlHalfRight = GUICtrlCreateButton('half right', 90, 150, 80, 20) Global $controlStop = GUICtrlCreateButton('stop', 170, 150, 80, 20) Global $controlHalfLeft = GUICtrlCreateButton('half left', 250, 150, 80, 20) Global $controlFullLeft = GUICtrlCreateButton('full left', 330, 150, 80, 20) GUISetState() GUIRegisterMsg($WM_HSCROLL, "_GUIEvents") $start = TimerInit() While 1 $hMsg = GUIGetMsg() Switch $hMsg Case $GUI_EVENT_CLOSE _exit() Case $modo0 If $modo <> 0 Then $modo = 0 Case $modo1 If $modo <> 1 Then $modo = 1 sendBit(0) $jumpDirection = 1 Case $modo2 If $modo <> 2 Then $modo = 2 sendBit(0) Case $modo3 If $modo <> 3 Then $modo = 3 ;Case $modo4 ; If $modo <> 4 Then $modo = 4 Case $controlFullRight Case $controlHalfRight Case $controlStop Case $controlHalfLeft Case $controlFullLeft EndSwitch If TimerDiff($start) > $delay Then Switch $modo Case 0;random Local $num = Random(0, 2 ^ $canais, 1) sendBit($num) ;If $num == 2 ^ $canais - 1 Then Beep(500, 1500) Case 1;barra For $xx = 0 To $canais - 1 If $jumpDirection Then If $ledState[$xx] = 0 And Not BitAND(2 ^ $xx, $jump) Then $jump += 2 ^ $xx ExitLoop EndIf Else If $ledState[$canais - 1 - $xx] = 1 And BitAND(2 ^ ($canais - 1 - $xx), $jump) Then $jump -= 2 ^ ($canais - 1 - $xx) ExitLoop EndIf EndIf Next If $jump = 2 ^ $canais - 1 Then $jumpDirection = 0 If $jump = 0 Then $jumpDirection = 1 sendBit($jump) Case 2 Local $id = _ArraySearch($ledState, 1, 0, $canais - 1, 0, 0, 0) If $id == -1 Then sendBit(1) Else If $id == $canais - 1 Then sendBit(1) Else sendBit(2 ^ ($id + 1)) EndIf EndIf Case 3 Local $id = _ArraySearch($ledState, 1) If $id == 0 Then $wer = 2 ^ ($canais - 1) Else $wer = 2 ^ ($id - 1) EndIf sendBit($wer) ;~ If _ArrayToString($ledState, '') == '10000000' Then ;~ sendBit(0) ;~ Else ;~ If _ArrayToString($ledState, '') == '00000000' Then ;~ sendBit(2 ^ $canais - 2) ;~ Else ;~ Local $id = _ArraySearch($ledState, 1) ;~ sendBit(2 ^ ($id - 1)) ;~ EndIf ;~ EndIf EndSwitch $start = TimerInit() EndIf WEnd Func _GUIEvents($hWnd, $iMsgID, $WParam, $LParam) #forceref $hWnd, $iMsgID, $wParam, $lParam Switch $iMsgID Case $WM_HSCROLL Switch $LParam Case $hSlider ;GUICtrlSendToDummy($iDumSlider, GUICtrlRead($delayControl)) ConsoleWrite('>' & GUICtrlRead($delayControl) & @LF) $delay = GUICtrlRead($delayControl) * 10 GUICtrlSetData($delayLabel, 'delay[' & $delay & ' ms]') EndSwitch EndSwitch EndFunc ;==>_GUIEvents Func sendBit($input) $WriteAddress = $PortAddress If $input < 0 Or $input > 255 Then Return _led($input) DllCall($DLLFileAndPath, 'int', 'Out32', 'int', $WriteAddress, 'int', $input) EndFunc ;==>sendBit Func _led($input) For $xx = 0 To $canais - 1 If BitAND(2 ^ $xx, $input) And $ledState[$xx] == 0 Then GUICtrlSetBkColor($led[$xx], 0xFD0202) $ledState[$xx] = 1 ElseIf Not BitAND(2 ^ $xx, $input) And $ledState[$xx] == 1 Then GUICtrlSetBkColor($led[$xx], 0x6F0202) $ledState[$xx] = 0 EndIf Next EndFunc ;==>_led Func _exit() SetLPTPortPins($PortAddress, 0, 0, 0, 0, 0, 0, 0, 0) DllClose($hDLL) DllClose($DLLFileAndPath) Exit EndFunc ;==>_exit ; ç=231/E7 Ç=199/C7 ;Functions -> where the action happens! Func SetLPTPortPins($WriteAddress, $Bit0, $Bit1, $Bit2, $Bit3, $Bit4, $Bit5, $Bit6, $Bit7) ;Convert bits to BCD $BCD = 0 If $Bit0 = 1 Then $BCD = $BCD + 1 If $Bit1 = 1 Then $BCD = $BCD + 2 If $Bit2 = 1 Then $BCD = $BCD + 4 If $Bit3 = 1 Then $BCD = $BCD + 8 If $Bit4 = 1 Then $BCD = $BCD + 16 If $Bit5 = 1 Then $BCD = $BCD + 32 If $Bit6 = 1 Then $BCD = $BCD + 64 If $Bit7 = 1 Then $BCD = $BCD + 128 ;pass the call to inpout32.dll DllCall($DLLFileAndPath, 'int', 'Out32', 'int', $WriteAddress, 'int', $BCD) EndFunc ;==>SetLPTPortPins Func CalculateRegisterAddresses($BaseAddress) ;check for correct hex prefix If Not (StringLeft($BaseAddress, 2) = '0x' Or StringLeft($BaseAddress, 2) = '0X') Then MsgBox(0, 'Invalid Hex Notation', 'The port address ' & $BaseAddress & ' entered was not in valid Hexadecimal notation. It must start with 0x') Exit EndIf ;check for valid hex characters in suffix If StringIsXDigit(StringTrimLeft($BaseAddress, 2)) = 0 Then MsgBox(0, 'Invalid Hex Notation', 'The port address ' & $BaseAddress & ' entered was not in valid Hexadecimal notation. The characters after the 0x must be only 0-9 and A-F') Exit EndIf ;calculate status register address ;Msgbox (0,'Debug','$BaseAddress = '& $BaseAddress & @CRLF & 'StringTrimLeft($BaseAddress, 2) = ' & StringTrimLeft($BaseAddress, 2) & @CRLF & 'Dec(StringTrimLeft($BaseAddress, 2)) = ' & Dec(StringTrimLeft($BaseAddress, 2)) & @CRLF & 'Hex(Dec(StringTrimLeft($BaseAddress, 2)) + 1) = ' & Hex(Dec(StringTrimLeft($BaseAddress, 2)) + 1)) $RawHex = Hex(Dec(StringTrimLeft($BaseAddress, 2)) + 1) ;trim leading zeros While 1 If StringLeft($RawHex, 1) = '0' Then $RawHex = StringTrimLeft($RawHex, 1) Else ExitLoop EndIf WEnd $StatusRegisterAddress = '0x' & $RawHex ;calculate control register address $RawHex = Hex(Dec(StringTrimLeft($BaseAddress, 2)) + 2) ;trim leading zeros While 1 If StringLeft($RawHex, 1) = '0' Then $RawHex = StringTrimLeft($RawHex, 1) Else ExitLoop EndIf WEnd $ControlRegisterAddress = '0x' & $RawHex EndFunc ;==>CalculateRegisterAddresses ; Webgrafia ; http://www.autoitscript.com/forum/topic/143469-slider-events/ http://www.youtube.com/watch?v=DL7rwJqljCk Controlando um motor de passo. A montagem para controlar o motor de passo levou um tempo considerável, o motor eu consegui de uma impressora velha, mas até achar o esquema dele na internet e desvendar a ordem das bobinas é que foi o bicho, mas tecnicamente falando, foi só seguir o Rogercom também. Eu tive uma dificuldade considerável neste script, mas não em relação ao controle da porta paralela, o que está deficiente é a forma como é controlado o movimento, tem que ir clicando nos botões para movimentar. Eu realmente gostaria de fazer algo parecido com isso: Enquanto mantiver a tecla 'A' pressionada $modo = 0, liberou a tecla 'A', $modo = 3. Enquanto mantiver a tecla 'B' pressionada $modo = 1, liberou a tecla 'B', $modo = 3. Neste ponto aceito sugestões para fazer algo descente! ^^ A variável $modo é que armazena o tipo do movimento controlar o motor. Ainda não entendo muito do controle de motores de passo, mas sei que AutoIt vai além de um simples script. Tentei de diversas formas, usando _IsPressed, mas toda hora o Windows fica apitando. Com IrrLicht não tenho esse problema... #include-once #include <WindowsConstants.au3> #include <Array.au3> #include <Misc.au3> #include <GUIConstantsEx.au3> #include <ButtonConstants.au3> #include <String.au3> #include <WinAPI.au3> ; WEBGRAFIA ; http://www.autoitscript.com/forum/topic/31708-parallel-port-control/ Global $hGui, $hMsg, $hMsgOld Global $keyRigFul, $keyRigHal, $keySopt, $keyLefHal, $keyLefFul, $key = 0, $mode = 3, $oldMode Global $hKeyProc = DllCallbackRegister('_KeyProc', 'long', 'int;wparam;lparam') Global $DLLFileAndPath = 'inpout32.dll', $PortAddress = '0x278', $hMsg If FileExists($DLLFileAndPath) = 0 Then MsgBox(0, 'Missing DLL File', 'Parallel Port Control DLL Missing at ' & $DLLFileAndPath & '. Cannot Continue.' & @CRLF & @CRLF & 'Download DLL from http://www.logix4u.net/inpout32.htm') _exit() EndIf Global $hMod = _WinAPI_GetModuleHandle(0) Global $hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hKeyProc), $hMod) HotKeySet('{ESC}', '_exit') ;$hGui = GUICreate('CNC', 800, 300, -1, -1) $hGui = GUICreate('Motor de passo', 800, 300, -1, -1, -1, 0x2000000) Global $led[4], $ledState[4] = [1, 0, 0, 0] For $xx = 0 To 3 $led[$xx] = GUICtrlCreateButton('', 50 + 80 * $xx, 10, 80, 80, $BS_ICON) GUICtrlSetColor(-1, 0xD4D0C8) If $ledState[$xx] == 0 Then GUICtrlSetBkColor($led[$xx], 0x6F0202) Else GUICtrlSetBkColor($led[$xx], 0xFD0202) EndIf Next $hButton0 = GUICtrlCreateButton('-A', 10, 200, 80, 20) $hButton1 = GUICtrlCreateButton('-B', 90, 200, 80, 20) $hButton2 = GUICtrlCreateButton('-C', 170, 200, 80, 20) $hButton3 = GUICtrlCreateButton('STOP', 250, 200, 80, 20) $hButton4 = GUICtrlCreateButton('+C', 330, 200, 80, 20) $hButton5 = GUICtrlCreateButton('+B', 410, 200, 80, 20) $hButton6 = GUICtrlCreateButton('+A', 490, 200, 80, 20) GUICtrlSetBkColor($hButton3, 0xB7D364) GUISetState(@SW_SHOW) Global $start = TimerInit() While 1 If TimerDiff($start) > 10 Then Switch $mode Case 0 _lessA() Case 1 _lessB() Case 2 _lessB() Case 3 Case 4 _moreC() Case 5 _moreB() Case 6 _moreA() EndSwitch $start = TimerInit() EndIf $hMsg = GUIGetMsg() Switch $hMsg Case $GUI_EVENT_CLOSE _exit() Case $hButton0 _lessA() Case $hButton1 _lessB() Case $hButton2 _lessC() Case $hButton3 Case $hButton4 _moreC() Case $hButton5 _moreB() Case $hButton6 _moreA() EndSwitch WEnd Func _led() For $xx = 0 To 3 If $ledState[$xx] Then If $ledState[$xx] == 1 Then GUICtrlSetBkColor($led[$xx], 0xFD0202) Else If $ledState[$xx] == 0 Then GUICtrlSetBkColor($led[$xx], 0x6F0202) EndIf Next _sendBit() EndFunc ;==>_led Func _lessA() Local $read = _ArrayToString($ledState, '') Switch $read Case '0001' $read = '0010' Case '0010' $read = '0100' Case '0100' $read = '1000' Case '1000' $read = '0001' Case '0011' $read = '0100' Case '0110' $read = '1000' Case '1100' $read = '1000' Case '1001' $read = '0001' EndSwitch $read = StringSplit($read, '', 2) For $xx = 0 To 3 $ledState[$xx] = Int($read[$xx]) Next _led() EndFunc ;==>_lessA Func _lessB() Local $read = _ArrayToString($ledState, '') Switch $read Case '0001' $read = '0011' Case '0010' $read = '0110' Case '0100' $read = '1100' Case '1000' $read = '1001' Case '0011' $read = '0110' Case '0110' $read = '1100' Case '1100' $read = '1001' Case '1001' $read = '0011' EndSwitch $read = StringSplit($read, '', 2) For $xx = 0 To 3 $ledState[$xx] = Int($read[$xx]) Next _led() EndFunc ;==>_lessB Func _lessC() Local $read = _ArrayToString($ledState, '') Switch $read Case '1000' $read = '1001' Case '1001' $read = '0001' Case '0001' $read = '0011' Case '0011' $read = '0010' Case '0010' $read = '0110' Case '0110' $read = '0100' Case '0100' $read = '1100' Case '1100' $read = '1000' EndSwitch $read = StringSplit($read, '', 2) For $xx = 0 To 3 $ledState[$xx] = Int($read[$xx]) Next _led() EndFunc ;==>_lessC Func _stop() Return EndFunc ;==>_stop Func _moreA() Local $read = _ArrayToString($ledState, '') Switch $read Case '1000' $read = '0100' Case '0100' $read = '0010' Case '0010' $read = '0001' Case '0001' $read = '1000' Case '1100' $read = '0010' Case '0110' $read = '0001' Case '0011' $read = '1000' Case '1001' $read = '0100' EndSwitch $read = StringSplit($read, '', 2) For $xx = 0 To 3 $ledState[$xx] = Int($read[$xx]) Next _led() EndFunc ;==>_moreA Func _moreB() Local $read = _ArrayToString($ledState, '') Switch $read Case '1000' $read = '1100' Case '0100' $read = '0110' Case '0010' $read = '0011' Case '0001' $read = '1001' Case '1100' $read = '0110' Case '0110' $read = '0011' Case '0011' $read = '1001' Case '1001' $read = '1100' EndSwitch $read = StringSplit($read, '', 2) For $xx = 0 To 3 $ledState[$xx] = Int($read[$xx]) Next _led() EndFunc ;==>_moreB Func _moreC() Local $read = _ArrayToString($ledState, '') Switch $read Case '1000' $read = '1100' Case '1100' $read = '0100' Case '0100' $read = '0110' Case '0110' $read = '0010' Case '0010' $read = '0011' Case '0011' $read = '0001' Case '0001' $read = '1001' Case '1001' $read = '1000' EndSwitch $read = StringSplit($read, '', 2) For $xx = 0 To 3 $ledState[$xx] = Int($read[$xx]) Next _led() EndFunc ;==>_moreC Func _sendBit($input = '') $WriteAddress = $PortAddress Local $arr = _ArrayToString($ledState, ''), $temp = 0 For $xx = 0 To 3 If $ledState[$xx] == 1 Then $temp += 2 ^ $xx Next ConsoleWrite('ledState[' & $arr & '] temp[' & $temp & ']' & @LF) DllCall($DLLFileAndPath, 'int', 'Out32', 'int', $WriteAddress, 'int', $temp) EndFunc ;==>_sendBit Func _exit() DllCall($DLLFileAndPath, 'int', 'Out32', 'int', $PortAddress, 'int', 0) _WinAPI_UnhookWindowsHookEx($hHook) DllCallbackFree($hKeyProc) DllClose($DLLFileAndPath) Exit EndFunc ;==>_exit Func _KeyProc($nCode, $wParam, $lParam) Local $tKEYHOOKS, $keyCode $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam) If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam) EndIf If WinActive($hGui) Then If $wParam = $WM_KEYDOWN Then Local $keyCode = DllStructGetData($tKEYHOOKS, 'vkCode') Switch $keyCode Case 65;A If $mode == 3 Then $mode = 0 EndIf Case 53;S If $mode == 3 Then $mode = 1 EndIf Case 44;D If $mode == 3 Then $mode = 2 EndIf Case 46;F If $mode == 3 Then $mode = 4 EndIf Case 47;G If $mode == 3 Then $mode = 5 EndIf Case 48;H If $mode == 3 Then $mode = 6 EndIf EndSwitch ElseIf $wParam = $WM_KEYUP Then Local $keyCode = DllStructGetData($tKEYHOOKS, 'vkCode') Switch $keyCode Case 65;A If $mode == 0 Then $mode = 3 EndIf Case 53;S If $mode == 1 Then $mode = 3 EndIf Case 44;D If $mode == 2 Then $mode = 3 EndIf Case 46;F If $mode == 4 Then $mode = 3 EndIf Case 47;G If $mode == 5 Then $mode = 3 EndIf Case 48;H If $mode == 6 Then $mode = 3 EndIf EndSwitch EndIf EndIf Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam) EndFunc ;==>_KeyProc ;motores ; http://pdf.directindustry.com/pdf/rta/the-general-catalogue-of-sanyo-denki-stepping-motors/20651-50655-_5.html ; http://sanyo-denki-online.com/nema23.htm ; http://embeddedfortheevil.wordpress.com/2010/07/03/stepper-motor-unipolar-control-via-parallel-port-2/ ; http://madan.wordpress.com/parallel-port/ ; http://datasheet.seekic.com/datasheet/KH42JM2-902_ETC_[ETC].html ; Sanyo Denki: 42 oz-in ;~ UNIPOLAR connection: Voltage: 6.4 V DC ;~ Current / phase: 1.2 A / phase ;~ Resistance / phase: 5.3 Ohm / phase ;~ Inductance / phase: 4.3 mH / phase ;~ Holding Torque 42 oz-in ;~ If _IsPressed('74', $hDLL) And $mode == 2 Then ;~ GUICtrlSetBkColor($hButton0, 0xB7D364) ;~ GUICtrlSetBkColor($hButton3, 0xD4D0C8) ;~ $mode = 0 ;~ ElseIf Not _IsPressed('74', $hDLL) And $mode == 0 Then ;~ GUICtrlSetBkColor($hButton0, 0xD4D0C8) ;~ GUICtrlSetBkColor($hButton3, 0xB7D364) ;~ $oldMode = 0 ;~ $mode = 2 ;~ EndIf ;~ If _IsPressed('75', $hDLL) And $mode == 2 Then ;~ GUICtrlSetBkColor($hButton1, 0xB7D364) ;~ GUICtrlSetBkColor($hButton3, 0xD4D0C8) ;~ $mode = 1 ;~ ElseIf Not _IsPressed('75', $hDLL) And $mode == 1 Then ;~ GUICtrlSetBkColor($hButton1, 0xD4D0C8) ;~ GUICtrlSetBkColor($hButton3, 0xB7D364) ;~ $oldMode = 1 ;~ $mode = 2 ;~ EndIf ;~ If _IsPressed('76', $hDLL) And $mode == 2 Then ;~ GUICtrlSetBkColor($hButton5, 0xB7D364) ;~ GUICtrlSetBkColor($hButton3, 0xD4D0C8) ;~ $mode = 3 ;~ ElseIf Not _IsPressed('76', $hDLL) And $mode == 3 Then ;~ GUICtrlSetBkColor($hButton5, 0xD4D0C8) ;~ GUICtrlSetBkColor($hButton3, 0xB7D364) ;~ $oldMode = 3 ;~ $mode = 2 ;~ EndIf ;~ If _IsPressed('77', $hDLL) And $mode == 2 Then ;~ GUICtrlSetBkColor($hButton6, 0xB7D364) ;~ GUICtrlSetBkColor($hButton3, 0xD4D0C8) ;~ $mode = 4 ;~ ElseIf Not _IsPressed('77', $hDLL) And $mode == 4 Then ;~ GUICtrlSetBkColor($hButton6, 0xD4D0C8) ;~ GUICtrlSetBkColor($hButton3, 0xB7D364) ;~ $oldMode = 4 ;~ $mode = 2 ;~ EndIf   http://www.youtube.com/watch?v=G119uh8Z0eM
  7. Como ignorar Critical Errors

    Use: Global $oError = ObjEvent("AutoIt.Error", "_ErrFunc") Func _ErrFunc($oErr)     ConsoleWrite("COM Error, ScriptLine(" & $oErr.scriptline & ") : Number 0x" & Hex($oErr.number, 8) & " - " & $oErr.windescription & @CRLF) EndFunc   ;==>_ErrFunc
  8. Como ignorar Critical Errors

    Olá @Bllee, falando especificamente do erro que você postou acima, você está tentando imprimir na saída do console, a variável $X, só que ela nunca foi usada antes... Muito menos declarada... O ideal é sempre definir as variáveis antes de começar a usá-las, exemplo: Local $x ConsoleWrite($x) Assim não dá erro. Mas tá... e qual o valor de $x? Nenhum... Nada... Pode ser "" (vazio). Pelo menos, esse erro, tem essa forma de corrigir.
  9. IPC - Pode ser interceptado?

    Bem... o AutoIt é apenas uma linguagem de script, para fazer automação de tarefas repetitivas, não é uma Framework grande e maduro de desenvolvimento. Nesse propósito (automação de tarefas repetitivas), eu acho que ela cumpre muito bem o seu papel. Mas não é porque não existe bibliotecas (UDFs) mais "avançadas" que não se possa criá-las... (só que as vezes é chato, por 'n' motivos). Meu esforço neste momento é de tentar perceber uma forma mais fácil de escrever um script multi janelas sem "massarocar" tanto o código. Dizendo com outras palavras: ter uma janela principal, e outras janelas de funções especificas (ou filhas) com o seu código muito bem separado da janela principal. Isso na hora de desenvolver e prestar manutenção facilita muito. Mas era necessário uma forma de fazer acontecer a comunicação entre as janelas. IPC foi uma alternativa das opções que vislumbrei, mas quando visualizei uma janela de troca de senha por IPC, eu pensei: xi... Será que é seguro? Mas algum tempo depois, consegui escrever um código que ainda precisa ser desenvolvido, mas consegue separar muito bem os blocos de cada janela com apenas algumas linhas se misturando com o código principal. Enfim... Seria muito bom ter um código assim: #include-once #include <Array.au3> #include <main.au3> #include <main_login.au3> #include <main_menu.au3> #include <main_logoff.au3> #include <main_quit.au3> While Sleep(25) WEnd Em vez de fazer aquela massaroca de código que eu faço, misturando tudo, de todas as janelas, por todos os lugares, poder fazer tudo por blocos, cada bloco funcional e independente do outro. E cada bloco só funciona quando é chamado, parece muito bom! Ao finalizar este bloco, ele libera todos os recursos utilizados no momento de sua inicialização.
  10. https://www.autoitscript.com/forum/topic/118440-send-message-to-a-process/?do=findComment&comment=824201 Neste tópico, tem um exemplo bem legal de IPC (Interprocess Comunication, acho que é isso). Você faz duas janelas distintas conversarem entre si, trocar informações. Mas somente dentro da mesma sessão do Windows, quero dizer, na mesma conta. Até hoje não vi, uma forma de IPC descente, que não seja por TCP/IP. Tá, e onde usar isso? Pra que usar uma janela se comunicando com a outra? Facilitar o desenvolvimento: você tem a sua aplicação principal, clica num botão e aparece uma janela com um relatório. Você tem duas janelas, com funções distintas entre si, mas fazem parte do mesmo código (estão no mesmo script). E fazer um código que faça "apenas isso", uma janela principal e uma relatório, já é um belo de um trabalho! Lógico, tem partes que são apenas da janela A, tem partes que são apenas da janela B, tem partes comum da janela A e B. Mas e se fosse possível dividir as tarefas? Exemplo: a janela A, é o aplicativo JanelaA.exe, e um determinado momento, você clica na janela relatório, e ele chama a JanelaB.exe, que recebe todos os dados por IPC, da janela A. Você se preocupa somente com o desenvolvimento de uma janela por vez, os códigos estão muito bem isolados e um não interfere no outro. Parece bom né? Se ficar no pensamento do relatório, maravilha! Mas então pensei numa simples janelinha de "Alterar senha". Você já pensou quanto código você tem que desenvolver atrás de uma janela como essa? Verificar se tem mais de 8 caracteres, se tem uma maiúscula, se a senha e a confirmação de senha são iguais, etc... Mas o que me fez escrever esse post é: e a comunicação entre as janelas, não pode ser interceptada?
  11. Bem... Segundo o Google Translator, DUMMY é um adjetivo que significa: simulado simulated, dummy, mock, sham, assumed, feigned falso false, untrue, bogus, phony, wrong, dummy postiço false, dummy Mas e no AutoIt, pra que serve? Se você usar um GuiCtrlCreateButton, ele retorno o id do elemento, e você vê um botão na GUI (Graphic User Interface ou apenas janela). Se você usar um GuiCtrlCreateLabel, ele retorno o id do elemento, e você vê um label na GUI. E assim por diante... Se você usar um GuiCtrlCreateDummy, ele retorno o id do elemento, e você não vê nada na GUI. Como assim? Ele cria e não retorna nada? Sim! Isso mesmo! É um controle fake, falso. Ah, mas e isso tem utilidade? Pior que tem... Vou mostrar aqui 1 exemplo: Você quer fazer uma GUI, mas nessa GUI tem várias "telas", por exemplo: tela de login tela de cadastro tela de logout Cada tela tem seus elementos (buttons, edit, radio, combobox, etc)... São muitas telas, e cada tela tem seus elementos, pronto, virou um salseiro! Uma confusão! Como fazer para @GUI_SHOW e @GUI_HIDE nesses controles? É nessa questão que venho mostrar esse exemplo. Ocultar o que não precisa, e exibir o que precisa. Outra alternativa simples, seria usar um GuiCtrlCreateTab... Mas fica para outro tópico, vou me ater no Dummy(). A ideia é simples. Antes de começar a criar os comandos da tela da primeira "tela de login", você cria um Dummy antes: #Region Tela de login Global $dummy1 = GuiCtrlCreateDummy() GuiCtrlCreateLabel("Nome de usuário", x1, y1, w1, h1) GuiCtrlCreateInput("digite seu nome de usuario", x2, y2, w2, h2) GuiCtrlCreateLabel("Senha", x3, y3, w3, h3) GuiCtrlCreateInput("digite sua senha", x4, y4, w4, h4) Global $dummy2 = GuiCtrlCreateDummy() #EndeRegion Tela de login E assim... Eu desenho todas as telas que eu preciso: Tela de login, Tela de cadastro, Tela de logout, etc... O segredo é, um Dummy antes do primeiro controle, e um Dummy depois do último controle para cada tela ou sessão. E preciso de um jeito, de manipular cada sessão, isto é, fazer que quando eu quiser a sessão "Tela de login", ele exiba todos os elementos da "Tela de login", e oculte todos os outros elementos que não fazer parte da "Tela de login". Por isso um Dummy antes, e um Dummy depois! O Dummy nada mais é, do que um número qualquer... E qualquer que seja o próximo controle que você criar, ele terá um número a mais do que o Dummy, nesta tela. E o próximo controle, terá um número a mais do que o anterior, até você colocar o Dummy no fim. Então todos os controles da sessão "Tela de login", estarão entre um Dummy (número inicial) e outro Dummy (número final). Agora, já é possível sair ocultando e exibindo os controles. ;~ #AutoIt3Wrapper_AU3Check_Parameters= -q -d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7 ;~ #Tidy_Parameters=/sf #include-once #include <Array.au3> #include <GUIConstantsEx.au3> #include <EditConstants.au3> #include <StaticConstants.au3> #include <EditConstants.au3> OnAutoItExitRegister("OnExit") Opt("GUIOnEventMode", 1) Opt("GUIEventOptions", 1) Opt("MustDeclareVars", 1) Global $sLoremIpsum = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum." Global $aGuiSize[2] = [800, 600] Global $sGuiTitle = "GuiTitle" Global $hGui $hGui = GUICreate($sGuiTitle, $aGuiSize[0], $aGuiSize[1]) GUISetOnEvent($GUI_EVENT_CLOSE, "Quit") GUISetFont(11, 400, 0, "DOSLike", $hGui) #Region VIEWS Global $VIEW = 1 Global $aVIEWS[][4] = [[0, "login"], [0, "account"], [0, "exit"]] Global $pos[4] = [10, 10, 100, 25] For $ii = 0 To UBound($aVIEWS, 1) - 1 $aVIEWS[$ii][0] = GUICtrlCreateRadio($aVIEWS[$ii][1], $pos[0] + $ii * $pos[2], $pos[1], $pos[2], $pos[3]) GUICtrlSetOnEvent($aVIEWS[$ii][0], "View_Click") Next GUICtrlCreateGroup("", -99, -99, 1, 1) #EndRegion VIEWS #Region Tela0 $aVIEWS[0][2] = GUICtrlCreateDummy() Global $hLabel_Tela0_Texto = GUICtrlCreateLabel("Tela de login", 10, 50, 780, 25, BitOR($SS_CENTER, $SS_SUNKEN)) GUICtrlSetBkColor($hLabel_Tela0_Texto, 0xccbbaa) Global $hLabel_Tela0_Usuario = GUICtrlCreateLabel("usuario", 10, 83, 80, 25, $ES_RIGHT) Global $hInput_Tela0_Usuario = GUICtrlCreateInput("", 100, 83, 200, 25) Global $hLabel_Tela0_Senha = GUICtrlCreateLabel("senha", 10, 113, 80, 25, $ES_RIGHT) Global $hInput_Tela0_Senha = GUICtrlCreateInput("", 100, 113, 200, 25) Global $hButton_Tela0_TryLogin = GUICtrlCreateButton("Login", 100, 140, 80, 25) $aVIEWS[0][3] = GUICtrlCreateDummy() #EndRegion Tela0 #Region Tela1 $aVIEWS[1][2] = GUICtrlCreateDummy() Global $hLabel_Tela1_Texto = GUICtrlCreateLabel("Tela de cadastro", 10, 50, 780, 25, BitOR($SS_CENTER, $SS_SUNKEN)) GUICtrlSetBkColor($hLabel_Tela1_Texto, 0x889922) Global $hLabel_Tela1_Nome = GUICtrlCreateLabel("Nome completo", 10, 83, 160, 25, $ES_RIGHT) Global $hInput_Tela1_Nome = GUICtrlCreateInput("", 180, 80, 200, 25) Global $hLabel_Tela1_Usuario = GUICtrlCreateLabel("Nome de usuário", 10, 113, 160, 25, $ES_RIGHT) Global $hInput_Tela1_Usuario = GUICtrlCreateInput("", 180, 110, 200, 25) Global $hLabel_Tela1_Senha = GUICtrlCreateLabel("Senha", 10, 143, 160, 25, $ES_RIGHT) Global $hInput_Tela1_Senha = GUICtrlCreateInput("", 180, 140, 200, 25) $aVIEWS[1][3] = GUICtrlCreateDummy() #EndRegion Tela1 #Region Tela2 $aVIEWS[2][2] = GUICtrlCreateDummy() Global $hLabel_Tela2_Texto = GUICtrlCreateLabel("Tela de logout", 10, 50, 780, 25, BitOR($SS_CENTER, $SS_SUNKEN)) GUICtrlSetBkColor($hLabel_Tela2_Texto, 0xff0011) Global $hLabel_Tela2_Texto = GUICtrlCreateEdit($sLoremIpsum, 10, 83, 780, 400, $ES_MULTILINE) $aVIEWS[2][3] = GUICtrlCreateDummy() #EndRegion Tela2 GUISetState(@SW_SHOW, $hGui) View_Click($VIEW) While Sleep(25) WEnd Func OnExit() GUISetState($hGui, @SW_HIDE) GUIDelete($hGui) EndFunc ;==>OnExit Func Quit() Exit EndFunc ;==>Quit Func View_Click($input = -1) $VIEW = IsDeclared("input") ? $input : @GUI_CtrlId - $aVIEWS[0][0] GUICtrlSetState($aVIEWS[$VIEW][0], $GUI_CHECKED) For $ii = 0 To UBound($aVIEWS, 1) - 1 For $jj = $aVIEWS[$ii][2] + 1 To $aVIEWS[$ii][3] - 1 GUICtrlSetState($jj, $ii = $VIEW ? $GUI_SHOW : $GUI_HIDE) Next Next EndFunc ;==>View_Click Como disse... eis o segredo: Global $aVIEWS[][4] = [ _ [0, "login", "Dummy 0 inicio", "Dummy 0 fim"], _ [0, "account", "Dummy 1 inicio", "Dummy 1 fim"], _ [0, "exit", "Dummy 2 inicio", "Dummy 2 fim"] _ ] coluna 0 $aVIEWS, recebe o handle do CheckBox da tela coluna 1 $aVIEWS, recebe o nome do CheckBox da tela coluna 2 $aVIEWS, recebe o Dummy inicial coluna 3 $aVIEWS, recebe o Dummy final E a cada vez que você chama a função View_Click, ele sabe qual a tela que é pra mostrar, exibindo a tela solicitada, e ocultado tudo o que não é solicitado. Agora para pirar um pouco, os controles não são deletados da tela, eles apenas são ocultados e exibidos! Outra coisa, nem todo o controle pode responder bem aqui... Todos os controles básicos funcionam bem, quero dizer: GuiCtrlCreateButton, GuiCtrlCreateLabe, etc.. Os controles plus não respondem bem: _GuiCtrlCreateButton, _GuiCtrlCreateEdit, etc... Em tempo... Se você precisa executar uma função toda a vez que entrar em uma tela, adicine uma coluna no $aVIEWS, contendo o nome da função que deseja chamar: Func View_Click($input = -1) $VIEW = IsDeclared("input") ? $input : @GUI_CtrlId - $aVIEWS[0][0] GUICtrlSetState($aVIEWS[$VIEW][0], $GUI_CHECKED) CALL($aVIEWS[$VIEW][5]) For $ii = 0 To UBound($aVIEWS, 1) - 1 For $jj = $aVIEWS[$ii][2] + 1 To $aVIEWS[$ii][3] - 1 GUICtrlSetState($jj, $ii = $VIEW ? $GUI_SHOW : $GUI_HIDE) Next Next EndFunc ;==>View_Click Então, toda a vez que você mudar de tela, ele chama a função programada, graças à: CALL($aVIEWS[$VIEW][5]) Você pode fazer a execução de saída de tela... Adicione mais uma coluna, rss... Acredito que mostro aqui um exemplo prático do uso do GuiCtrlCreteDummy, e para pequenos projetos e devido à sua simplicidade se adapta muito bem. É isso! 8D
  12. Bom dia, Compartilho uma pequena função que auxilia muito o debug... Ao invés de usar o ConsoleWrite, use o Print. Versão melhorada: https://github.com/chechelaky/AutoIt/blob/master/Print/Print.au3 Local $arr[][4] = [ _         ["0a", "0b", "0c", "0d"], _         ["1a", "1b", "1c", "1d"], _         ["2a", "2b", "2c", "2d"], _         ["3a", "3b", "3c", "3d"], _         ["4a", "4b", "4c", "4d"], _         ["5a", "5b", "5c", "5d"], _         ["6a", "6b", "6c", "6d"], _         ["7a", "7b", "7c", "7d"], _         ["8a", "8b", "8c", "8d"], _         ["9a", "9b", "9c", "9d"], _         ["10a", "10b", "10c", "10d"], _         ["11a", "11b", "11c", "11d"] _         ] Saída: --> Press Ctrl+Alt+Break to Restart or Ctrl+Break to Stop +--0+--1+--2+--3+ 0 | 0a| 0b| 0c| 0d| 1 | 1a| 1b| 1c| 1d| 2 | 2a| 2b| 2c| 2d| 3 | 3a| 3b| 3c| 3d| 4 | 4a| 4b| 4c| 4d| 5 | 5a| 5b| 5c| 5d| 6 | 6a| 6b| 6c| 6d| 7 | 7a| 7b| 7c| 7d| 8 | 8a| 8b| 8c| 8d| 9 | 9a| 9b| 9c| 9d| 10 |10a|10b|10c|10d| 11 |11a|11b|11c|11d| +---+---+---+---+ +>14:09:07 AutoIt3.exe ended.rc:0 Local $arr[] = ["um", "dois", 3, 4, 5, 6, 7, 8, 9, 10, 22] Saída: --> Press Ctrl+Alt+Break to Restart or Ctrl+Break to Stop +----+ 0 | um| 1 |dois| 2 | 3| 3 | 4| 4 | 5| 5 | 6| 6 | 7| 7 | 8| 8 | 9| 9 | 10| 10 | 22| +----+ +>14:15:59 AutoIt3.exe ended.rc:0
  13. Multi-thread em autoit

    @mutleey, vou fazer os exemplos, acho que até cabe muito bem um exemplo de serviço do Windows com interface. Obs: serviço do windows não tem interface. @Pedro Pinheiro, gostei do termo "responsabilizar".
  14. Multi-thread em autoit

    @Pedro Pinheiro, o programa acima foi feito em AutoIt? Show de bola! Parabéns! Lá vou eu dar uma ideia maluca... @Manimal tem razão, AutoIt não é, e não será multi-thread... Mas já que você precisa "ler" as teclas de algum lugar... Porque não usa um script separado para fazer isso? Exemplo: Em vez de querer tudo em um único script, divide as funções. Um script apenas lê as teclas, o outros renderiza os gráficos, e quando precisar saber o estado das teclas, ele pega as informações do primeiro, que só lê. Ah, mas e como fazer um script conversar com outro? PIPEs, TCP/IP Como disse, uma sugestão doida.
  15. Aliviar uso da CPU

    @mutleey Que tal desvincular a função de dentro do loop? Eu não tenho ideia de como o AutoIt resolve internamente o uso do AdlibRegister, mas amontar todas as funções dentro do loop pode ter um momento que as coisas podem sair do controle... Algumas demora mais do que o esperado, e essa demora causa um efeito cascata, será que não? Então, a proposta do AdlibRegister é justamente essa, desafogar o loop. Veja este exemplo. ;~ #AutoIt3Wrapper_AU3Check_Parameters= -q -d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7 ;~ #Tidy_Parameters=/sf #include-once #include <SliderConstants.au3> #include <Array.au3> #include <GUIConstantsEx.au3> OnAutoItExitRegister("OnExit") Opt("GUIOnEventMode", 1) Opt("GUIEventOptions", 1) Opt("MustDeclareVars", 1) Global $aGuiSize[2] = [800, 600] Global $sGuiTitle = "GuiTitle" Global $hGui Global $aSlider[4], $aVal[4] = [100, 100, 100, 100], $aMov[4] = [-1, -1, -1, -1] $hGui = GUICreate($sGuiTitle, $aGuiSize[0], $aGuiSize[1]) GUISetOnEvent($GUI_EVENT_CLOSE, "Quit") $aSlider[0] = GUICtrlCreateSlider(10, 10, 20, 200, $TBS_VERT + $TBS_AUTOTICKS) GUICtrlSetData($aSlider[0], $aVal[0]) AdlibRegister("Slider0", 100) ; executa a função Slider0 a cada 100 mili segundos $aSlider[1] = GUICtrlCreateSlider(50, 10, 20, 200, $TBS_VERT + $TBS_AUTOTICKS) GUICtrlSetData($aSlider[1], $aVal[1]) AdlibRegister("Slider1", 200) ; executa a função Slider1 a cada 200 mili segundos $aSlider[2] = GUICtrlCreateSlider(90, 10, 20, 200, $TBS_VERT + $TBS_AUTOTICKS) GUICtrlSetData($aSlider[2], $aVal[2]) AdlibRegister("Slider2", 300) ; executa a função Slider2 a cada 300 mili segundos $aSlider[3] = GUICtrlCreateSlider(140, 10, 20, 200, $TBS_VERT + $TBS_AUTOTICKS) GUICtrlSetData($aSlider[3], $aVal[3]) AdlibRegister("Slider3", 400) ; executa a função Slider3 a cada 400 mili segundos GUISetState(@SW_SHOW, $hGui) While Sleep(25) WEnd Func OnExit() ; antes de encerrar o script, eu cancelo todos os adlib, é uma boa prática ; pois como o adlib não respeita um loop, o Exit pode ainda não ter sido concluído ; e o AutoIt pode executar alguma função do adlib AdlibUnRegister("Slider0") AdlibUnRegister("Slider1") AdlibUnRegister("Slider2") AdlibUnRegister("Slider3") GUISetState($hGui, @SW_HIDE) GUIDelete($hGui) EndFunc ;==>OnExit Func Quit() Exit EndFunc ;==>Quit Func Slider0() $aVal[0] = GUICtrlRead($aSlider[0]) + $aMov[0] If $aVal[0] <= 0 Or $aVal[0] >= 100 Then $aMov[0] *= -1 GUICtrlSetData($aSlider[0], $aVal[0]) EndFunc ;==>Slider0 Func Slider1() $aVal[1] = GUICtrlRead($aSlider[1]) + $aMov[1] If $aVal[1] <= 0 Or $aVal[1] >= 100 Then $aMov[1] *= -1 GUICtrlSetData($aSlider[1], $aVal[1]) EndFunc ;==>Slider1 Func Slider2() $aVal[2] = GUICtrlRead($aSlider[2]) + $aMov[2] If $aVal[2] <= 0 Or $aVal[2] >= 100 Then $aMov[2] *= -1 GUICtrlSetData($aSlider[2], $aVal[2]) EndFunc ;==>Slider2 Func Slider3() $aVal[3] = GUICtrlRead($aSlider[3]) + $aMov[3] If $aVal[3] <= 0 Or $aVal[3] >= 100 Then $aMov[3] *= -1 GUICtrlSetData($aSlider[3], $aVal[3]) EndFunc ;==>Slider3
  16. Enviar SMS

    @Pedro Pinheiro, ops! Desculpe! Eu me confundi, não, essa UDF do TELEGRAM não envia SMS, é tipo um WhatsApp, necessita de conexão com a internet.
  17. Enviar SMS

    @Pedro Pinheiro, o TELEGRAM é um concorrente do WhatsApp (eu acho melhor), pois tem uma API aberta e muito bem documentada: https://core.telegram.org/bots Sim, precisa instalar no celular, pra receber as mensagens do PC no celular. Mas há uma versão .exe muito leve e funcional. Depois do TELEGRAM instalado no celular, você precisa criar uma conta de BOT: https://core.telegram.org/bots#botfather Ao criar o BOT você receberá o TOKEN: https://core.telegram.org/bots/api#authorizing-your-bot Com o TOKEN você pode utilizar esta UDF do AutoIt para enviar mensagens. Essa API do TELEGRAM funciona realmente muito bem! Você pode programar um Script do AutoIt para ler a temperatura do processador e enviar a informação a cada 5 minutos. A UDF do AutoIt pode enviar: mensagem foto som qualquer tipo de arquivo Também é possível enviar uma mensagem do TELEGRAM do seu SmartPhone para o BOT (entenda UDF do AutoIt) e fazer alguma coisa... Por exemplo: Se você tiver um PC rodando com a UDF do TELEGRAM + ARDUINO, você pode enviar a mensagem do TELEGRAM do seu SmartPhone para o PC: ligar rele 1 desligar rele 2 Mas você precisa digitar a mensagem no TELEGRAM. Limitação: BOT não fala com BOT. Seria fantástico utilizar a API do TELEGRAM para controlar a UDF do AutoIt e criar um aplicativo para Android para fazer as coisas... Mas não consegui fazer isso. A frase acima aprendi à duras penas. Se alguém souber uma forma de fazer um BOT trocar mensagens com outro BOT, seria show. Essa eu não sei... Em tempo, quanto ao ChatID, é meio chato de descobri-lo, na verdade é o ID do usuário com quem o BOT vai conversar, veja aqui: https://stackoverflow.com/questions/32423837/telegram-bot-how-to-get-a-group-chat-id https://stackoverflow.com/questions/31078710/how-to-obtain-telegram-chat-id-for-a-specific-user/34440247
  18. Houve uma atualização do fórum, todos os links antigos terão que ser atualizados. Isso vai demorar um pouco.
  19. Enviar SMS

    bom dia @Pedro Pinheiro, sugiro o uso do Telegram. Embora houve uma tentativa de minha parte para fazer uma comunicação bidirecional entre ambos sem sucesso (PC -> Celular e Celular -> PC) sem muito sucesso, mas a comunicação PC -> Celular funciona perfeitamente.
  20. Converter scripts para utf-8

    @Manimal é animal! 8D
  21. Converter scripts para utf-8

    @lucasayrton, você criar uma macro no Notpad++ para auxiliar no processo.
  22. Converter scripts para utf-8

    Olá @lucasayrton, tente o notepad++
  23. _WinAPI_CreateWindowEx

    @Pedro Pinheiro a função _WinAPI_CreateWindowEx é um coringa. Com a mesma função você cria uma janela e os elementos da janela, como input, label, button, etc... Veja esse exemplo que eu traduzi (meia boca) do fórum alemão, mas deu para perceber o que a função _WinAPI_CreateWindowEx pode fazer. Mas nesse momento, infelizmente eu não sei dizer realmente qual a diferença entre a forma tradicional que utilizamos e esta... ;============================================================================== ; _WinAPI_CreateWindowEx.au3 ;============================================================================== #include <WindowsConstants.au3> #include <GuiConstantsEx.au3> #include <ButtonConstants.au3> #include <EditConstants.au3> #include <StaticConstants.au3> #include <Constants.au3> #include <WinAPI.au3> ; source: https://autoit.de/onlinehilfe/libfunctions/_WinAPI_CreateWindowEx.htm Opt("MustDeclareVars", 1) Global Const $IDC_STATIC = -1, $IDC_EDIT = 101 Global $hInstance ;============================================================================== Exit Example() ;============================================================================== Func Example() Local $hWndMain, $hWndEdit, $hWndStatic, $hWndButton $hInstance = _WinAPI_GetModuleHandle(0) ; cria uma janela principal $hWndMain = GUICreate( _ "_WinAPI_CreateWindowEx - Demo", _ ; título de janela 400, 300, -1, -1, _ ; tamanho e Position de janela BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPCHILDREN), _ ; janelatile $WS_EX_WINDOWEDGE, _ ; extendido janelatile 0) ; Handle de Parent-janela ; cria um simples campo de entrada $hWndEdit = _WinAPI_CreateWindowEx( _ 0, _ ; extendido janelatile "EDIT", _ ; Name o Fensterklasse "Pressione <ENTER>", _ ; Text/título de janela BitOR($WS_TABSTOP, $WS_CHILD, $WS_BORDER, _ ; janelatile $WS_VISIBLE, $ES_LEFT, $ES_NOHIDESEL), _ 100, 80, 200, 22, _ ; Position e tamanho de janela $hWndMain, _ ; Handle de Parent-janela $IDC_EDIT, _ ; Identifizierer de (Kind-)janela $hInstance, _ ; Instanzhandle de Moduls 0) ; aplicação definida valor ; cri um simples TextLabel $hWndStatic = _WinAPI_CreateWindowEx( _ 0, _ ; extendido janelatile "STATIC", _ ; Name o Fensterklasse "Text", _ ; Text/título de janela BitOR($WS_TABSTOP, $WS_CHILD, $WS_VISIBLE, _ ; janelatile $SS_CENTER), _ 160, 140, 80, 18, _ ; Position e tamanho de janela $hWndMain, _ ; Handle de Parent-janela $IDC_STATIC, _ ; Identifizierer de (Kind-)janela $hInstance, _ ; Instanzhandle de Moduls 0) ; aplicação definida valor ; cria um simples botão $hWndButton = _WinAPI_CreateWindowEx( _ 0, _ ; extendido janelatile "BUTTON", _ ; Name o Fensterklasse "Text", _ ; Text/título de janela BitOR($WS_TABSTOP, $WS_VISIBLE, $WS_CHILD, _ ; janelatile $BS_DEFPUSHBUTTON), _ 160, 220, 80, 25, _ ; Position e tamanho de janela $hWndMain, _ ; Handle de Parent-janela $IDOK, _ ; Identifizierer de (Kind-)janela $hInstance, _ ; Instanzhandle de Moduls 0) ; aplicação definida valor ; registra a funão da Janela GUIRegisterMsg($WM_COMMAND, "MyWM_COMMAND") ; exibe a Janela _WinAPI_ShowWindow($hWndMain, @SW_SHOW) While True Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop EndSwitch WEnd EndFunc ;==>Example Func MyWM_COMMAND($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg Local $sMessage Switch _WinAPI_LoWord($wParam) Case $IDC_EDIT ; Nachrichten de Eingabefeldes Switch _WinAPI_HiWord($wParam) Case $EN_UPDATE ContinueCase Case $EN_CHANGE ConsoleWrite(_WinAPI_GetWindowText($lParam) & @CRLF) EndSwitch Case $IDOK $sMessage = StringFormat("o botão com o ID %d foi deprimido.", $IDOK) _WinAPI_MsgBox( _ BitOR($MB_OK, $MB_ICONASTERISK), _ "MyWM_COMMAND", _ $sMessage) EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>MyWM_COMMAND ;================================ End of File =================================
  24. Framework Comercial

    @Manimal, acredito que fizemos funções similares em momentos diferentes, compartilho o meu código para aplicar ou formatar uma entrada numérica no formato de número real "000.000" com qualquer tipo de entrada, segue exemplo: https://github.com/chechelaky/AutoIt/tree/master/Diversos/Mask
  25. ok, li somente agora, vou providenciar.
×