Jump to content

Leaderboard


Popular Content

Showing most liked content since 07/02/2019 in all areas

  1. 2 points
    Talvez seja possível iniciar algo do tipo a partir desse código Instalei o BluetoothCLTools-1.2.0.56 e é possível gerenciar as conexões de bluetooth apartir dele Porém ainda não entendi como funciona todas as conexões. Todos os parâmetros estão neste link http://bluetoothinstaller.com/bluetooth-command-line-tools/ ou é possível visualizar pelo prompt de comando o help do arquivo digitando -h Exemplo: btcom.exe -h Este script eu desenvolvi no Windows 10. Não testei e outras versões. #cs ---------------------------------------------------------------------------- AutoIt Version: 3.3.14.5 Author: Rodrigo Chaves Script Function: Bluetooth Script 06/2020 #ce ---------------------------------------------------------------------------- #RequireAdmin ;Necessario para mudar o status do servico #include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <ListViewConstants.au3> #include <WindowsConstants.au3> #include <File.au3> #include <GuiListView.au3> #include <SendMessage.au3> #include <ProgressConstants.au3> #include <StaticConstants.au3> #include <Services.au3> Dim $sRoot = @ScriptDir hWnd_Main() Func hWnd_Main() ; Cria a GUI principal $hWnd_Main = GUICreate("AutoitBrasil", 620, 380, -1, -1) $ListView1 = GUICtrlCreateListView("Mac Address|Friendly Name|Type", 0, 0, 620, 320) GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 130) GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 150) $idBtn_Remove = GUICtrlCreateButton("Remove", 365, 330, 75, 25) $idBtn_Connect = GUICtrlCreateButton("Conectar", 445, 330, 75, 25) $idBtn_Pair = GUICtrlCreateButton("Parear", 525, 330, 75, 25) $idBtn_Refresh = GUICtrlCreateButton("Atualizar", 10, 330, 75, 25) $idBtn_ConnectView = GUICtrlCreateButton("Ver conexões", 95, 330, 75, 25) GUISetState(@SW_SHOW) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit ;Verifica quais conexoes bluetooth estao disponiveis e visiveis Case $idBtn_ConnectView $iStatusProgress = hWnd_Status($hWnd_Main, 'Obtendo informações das conexões visíveis. . .') viewConnections() GUIDelete($iStatusProgress) ;Atualiza a lista de dispoitivos Case $idBtn_Refresh $iStatusProgress = hWnd_Status($hWnd_Main, 'Executando discovery. . .') $aDiscovery = discoveryDevices() If IsArray($aDiscovery) Then _GUICtrlListView_DeleteAllItems($ListView1) For $i = 1 To UBound($aDiscovery) - 1 GUICtrlCreateListViewItem($aDiscovery[$i], $ListView1) Next EndIf GUIDelete($iStatusProgress) ;Remove o dispositivos das conexoes conhecidas Case $idBtn_Remove Local $aItem = _GUICtrlListView_GetItemTextArray($ListView1) If IsArray($aItem) Then If $aItem[1] <> '' Then $iStatusProgress = hWnd_Status($hWnd_Main, 'Tentando remover. . .') Local $iQuestion = MsgBox(262144 + 32 + 4, 'Debug', 'Tem certeza que deseja remover o dispositivo selecionado?' & @CRLF & @CRLF & 'Mac Address: ' & $aItem[1] & @CRLF & 'Device: ' & $aItem[2] & 'Type: ' & $aItem[3], 60) If $iQuestion = 6 Then bluetoothRemove($aItem[1]) EndIf GUIDelete($iStatusProgress) Else MsgBox(262144 + 16, 'Debug', 'Selecione um item da lista') EndIf EndIf ;Conecta um dispositivo bluetooth Case $idBtn_Connect Local $aItem = _GUICtrlListView_GetItemTextArray($ListView1) If IsArray($aItem) Then If $aItem[1] <> '' Then $iStatusProgress = hWnd_Status($hWnd_Main, 'Conectando. . .') bluetoothConnect($aItem[1]) GUIDelete($iStatusProgress) Else MsgBox(262144 + 16, 'Debug', 'Selecione um item da lista') EndIf EndIf ;Pareia um dispositivo bluetooth Case $idBtn_Pair Local $aItem = _GUICtrlListView_GetItemTextArray($ListView1) If IsArray($aItem) Then If $aItem[1] <> '' Then $iStatusProgress = hWnd_Status($hWnd_Main, 'Pareando. . .') bluetoothPair($aItem[1]) GUIDelete($iStatusProgress) Else MsgBox(262144 + 16, 'Debug', 'Selecione um item da lista') EndIf EndIf EndSwitch WEnd EndFunc ;==>hWnd_Main Func viewConnections() checkIsBluettothOn() Local $iPID Local $iPID = Run(@ComSpec & ' /c "' & $sRoot & '\btdiscovery.exe -s"', '', @SW_HIDE, 0x2) ProcessWaitClose($iPID) Local $sOutput = StdoutRead($iPID) MsgBox(262144 + 64, 'Debug', $sOutput) EndFunc ;==>viewConnections Func bluetoothConnect($sByRefDevice) checkIsBluettothOn() Local $iPID Local $sOutput $iPID = Run(@ComSpec & ' /c "' & $sRoot & '\btcom.exe" -b' & $sByRefDevice & ' -c -s110b', '', @SW_HIDE, 0x2) ProcessWaitClose($iPID) $sOutput = StdoutRead($iPID) ConsoleWrite($sOutput & @CRLF) $iPID = Run(@ComSpec & ' /c "' & $sRoot & '\btcom.exe" -b' & $sByRefDevice & ' -c -s110e', '', @SW_HIDE, 0x2) ProcessWaitClose($iPID) $sOutput = StdoutRead($iPID) ConsoleWrite($sOutput & @CRLF) EndFunc ;==>bluetoothConnect Func bluetoothPair($sByRefDevice) checkIsBluettothOn() Local $iPID Local $sOutput $iPID = Run(@ComSpec & ' /c "' & $sRoot & '\btpair.exe -b' & $sByRefDevice & ' -c -s110b"', '', @SW_HIDE, 0x2) ProcessWaitClose($iPID) $sOutput = StdoutRead($iPID) ConsoleWrite($sOutput & @CRLF) $iPID = Run(@ComSpec & ' /c "' & $sRoot & '\btpair.exe -b' & $sByRefDevice & ' -c -s110e"', '', @SW_HIDE, 0x2) ProcessWaitClose($iPID) $sOutput = StdoutRead($iPID) ConsoleWrite($sOutput & @CRLF) EndFunc ;==>bluetoothPair Func bluetoothRemove($sByRefDevice) checkIsBluettothOn() Local $iPID Local $sOutput $iPID = Run(@ComSpec & ' /c "' & $sRoot & '\btcom.exe" -b' & $sByRefDevice & ' -r -s110b', '', @SW_HIDE, 0x2) ProcessWaitClose($iPID) $sOutput = StdoutRead($iPID) ConsoleWrite($sOutput & @CRLF) $iPID = Run(@ComSpec & ' /c "' & $sRoot & '\btcom.exe" -b' & $sByRefDevice & ' -r -s110e', '', @SW_HIDE, 0x2) ProcessWaitClose($iPID) $sOutput = StdoutRead($iPID) ConsoleWrite($sOutput & @CRLF) EndFunc ;==>bluetoothRemove Func discoveryDevices() checkIsBluettothOn() Local $iPID Local $sOutput, $sTab = ' ' Local $aOutput, $aDevice, $aReturn Local $iPID = Run(@ComSpec & ' /c "' & $sRoot & '\btdiscovery.exe -s"', '', @SW_HIDE, 0x2) ProcessWaitClose($iPID) Local $sOutput = StdoutRead($iPID) ConsoleWrite($sOutput & @CRLF) $aOutput = StringSplit($sOutput, @CRLF, 1) If IsArray($aOutput) Then For $i = 1 To UBound($aOutput) - 1 If StringLeft($aOutput[$i], 1) = '(' Then $aDevice = StringSplit($aOutput[$i], $sTab, 1) If IsArray($aDevice) Then If $aDevice[0] > 2 Then $aReturn &= $aDevice[1] & '|' & $aDevice[2] & '|' & $aDevice[3] & @CRLF EndIf EndIf EndIf Next EndIf $aReturn = StringSplit($aReturn, @CRLF, 1) Return $aReturn EndFunc ;==>discoveryDevices Func hWnd_Status($hWnd_ByRef, $sByRefText = 'Aguarde') $hWnd_Status = GUICreate("", 620, 380, 0, 0, $WS_POPUP, $WS_EX_MDICHILD, $hWnd_ByRef) GUISetBkColor(0x252525) Local $aGetPos = WinGetPos($hWnd_Status) Local $Graphic1 = GUICtrlCreateGraphic(0, 95, $aGetPos[2] - 2, 160) Local $Label1 = GUICtrlCreateLabel($sByRefText, 0, 155, $aGetPos[2] - 2, 17, $SS_CENTER) GUICtrlSetFont(-1, 10, 400, 0, "Segoe UI") GUICtrlSetBkColor(-1, -2) GUICtrlSetColor(-1, 0xFFFFFF) Local $Progress1 = GUICtrlCreateProgress(165, 185, 310, 12, 0x8) _SendMessage(GUICtrlGetHandle($Progress1), $PBM_SETMARQUEE, 1, 16) WinSetTrans($hWnd_Status, '', 230) GUISetState() WinActivate($hWnd_ByRef) Return $hWnd_Status EndFunc ;==>hWnd_Status Func checkIsBluettothOn() Local $sParam1 = 'bthserv', $sParam2 = 'bthHFSrv' Local $aCheckService = _Service_QueryStatus($sParam1) If $aCheckService[1] <> 4 Then Local $iQuestion = MsgBox(262144 + 32 + 4, 'Debug', 'O serviço bluetoth não está habilitado' & @CRLF & @CRLF & 'Deseja habilitar agora?', 60) If $iQuestion = 6 Then _Service_Start($sParam1) _Service_Start($sParam2) EndIf EndIf EndFunc ;==>checkIsBluettothOn Os demais arquivos necessários estão no link https://1drv.ms/u/s!AnsPM67Cyv4Xk9MKRtGzYbK2dTsCIA?e=Y3nXkD
  2. 2 points
    Dessa vez esta com banco de dados em SQL
  3. 2 points
    Olá pessoal. Aproveitando o feriado de carnaval, que dependendo da região é mais ou menos comemorado, quero abrir um tópico para que todos possam dar sua contribuição em dicas, macetes e truques ao utilizar o AutoIt. Afinal todos nós, de uma maneira ou outra, ao fazermos nosso scripts, utilizamos as vezes sem nem mesmo pensar, alguma dica ou macete. Vou tentar manter compilado aqui no 1o post, essas dicas. Não tem sequência, nem melhor nem pior. Só uma lista! 1) a diretiva #include serve para incorporarmos códigos já prontos referentes a um determinado tópico aos nossos scripts. Ao utilizarmos o #include tem duas maneiras, que passam desapercebidas: #include <> com os sinais de maior e menor, que identifica um arquivo que será procurado e incorporado a partir da subpasta Include da pasta principal do AutoIt #include "" com as aspas, que identiica um arquivo que está na mesma pasta do script, facilitando assim para desdobrar o script em vários outros scripts menores para facilitar a edição ou manutenção Exemplos: #include <Misc.au3> - estamos procurando o arquivo Misc.au3 que está na pasta Include #include "MeuScript.au3" - estamos procurando o arquivo MeuScript.au3 que está na mesma pasta do meu script stual Aqui fica uma segunda dica que eu utilizo. Quando o script passa a ser meio genérico, tipo uma biblioteca de scripts em comum a vários projetos (vide o tópico Framework), eu costumo criar um link simbólico do arquivo na subpasta Include. Dessa forma, tenho o melhor dos dois mundos, pois mantenho o script "à mão" e ao mesmo tempo ele está disponível para qualquer projeto, sem criar uma cópia do mesmo e correndo o risco de ficar com arquivos desatualizados. 2) Já aconteceu a situação de vc testar seu código e as mensagens estarem em português correto (ou com acentos) mas ao compilar o mesmo script, ele aparece com alguns caracteres malucos no lugar dos acentos? Outra situação é quando eu vejo o pessoal reclamando do erro UTF-8 ou UNICODE ao compilar algum script, principalmente do fórum gringo. Isto acontece porque ao escrevermos nosso códigos no SciTe (assumindo que vc use o editor padrão do AutoIt), os códigos são escritos utilizando o código de página Windows 1252, que preserva os acentos e demais caracteres diferenciados da nossa língua portuguesa e similares. Porém, várias ferramentas do AutoIt e outras exigem UNICODE como forma de codificação. Não vou entrar em detalhes aqui (não é local para isto), mas minha recomendação é que vcs modifiquem o SciTe para que todos os seus scripts sejam gravados em UTF-8 with BOM, que é um padrão internacional UNICODE. Assim, vc ganha de várias formas: os acentos que estão no seu código em desenvolvimento serão transferidos adequada e corretamente para a versào compilada pode-se trocar scripts (ou compartilhá-los) nos fóruns estrangeiros sem problemas as ferramentas do AutoIt e outras externas não reclamarão da codificação do arquivo. Mas atenção, ao fazer esta modificação é necessário abrir o script, mudar a codificação e conferir o script para as mudanças que possam surgir, principalmente nas mensagens ao usuário. Ao salvar o script, ele já será salvo nste novo formato. Para fazer isto, com o script aberto no SciTe, vá no menu FILE, opção ENCODING e troque de Code Page Property para UFT-8 with BOM e salve seu script ou feche o editor, salvando o arquivo. Finalmente este procedimento é necessário ser feito em todos os seus scripts, o que dependendo da quantidade, pode ser um processo longo e trabalhoso/tedioso, assim vou colocar em outro tópico um script para fazer este processo de forma automática (a conversão apenas). Mesmo assim é importante que os scripts sejam conferidos. Veja aqui => Conversão de Codificação dos Scripts E vem mais por aí... A comunidade agradece!
  4. 2 points
    Olá. Dando sequência na ideia de customizar o SciTe, para fazê-lo basta editar os arqs de configuração. Isto pode ser feito de dentro do editor, pelo menu Option e selecionando o arquivo a ser modificado, Ou editando estes mesmos arquivos externamente através do bloco de notas (ou similar). Porém se fizer isso, recomendo que o SciTe esteja fechado para evitar que as alterações não sejam gravadas ou sejam sobregravadas quando o SciTe fechar. De qualquer maneira, editando estes arquivos (e quaisquer outros) pode aumentar o seu controle sobre o SciTe e deixar o seu ambiente de trabalho mais amigável. Vamos aos arquivos: 1) Menu Options / Open User Options File, ou externamente edite o arquivo "C:\Program Files (x86)\AutoIt3\SciTE\SciTEUser.properties" Este arquivo controle várias configurações do SciTe, em particular algumas das mais interessantes como: highlight.current.word=1 => para realçar a palavra onde está o cursor e podermos visualmente identificar as iguais no resto do código. Dica: quando fizer isto, normalmente mostra somente na tela as palavras iguais. No momento que vc move o cursor, vai selecionar outra palavra. A dica aqui é usar o botão do meio do mouse para rolar e ver as demais coincidências no resto do script highlight.current.word.minlength=3 => identifica qual o mínimo de letras para realçar uma palavra use.tabs=0 => para escolher entre tabulação ou espaço nas identações. Pessoalmente prefiro espaços, ou seja, quando eu aperto o TAB o SciTe insere x espaços a cada TAB. Para usar o TAB mesmo, coloque use.tabs=1 tabsize=3 => para escolher quantos espaços serão inseridos a cada TAB indent.size=3 => para escolher quantos espaços serão inseridos a cada nova linha para manter a identação highlight.current.word.stoponspace=0 => quando vc seleciona com o Shift uma quantidade maior do que uma palavra, tbm funciona o realce, porém ao chegar no primeiro espaço, para de realçar. Com esta opção, não para. Eu acho ótimo para comparar visualmente 2 linhas de código, pois ao marcar com o Shift, vai mostrando se a outra linha está igual. As vezes, uma pequena diferença como um apóstrofe é ruim de ver, mas no realce é fécil de ver. Tbm para mexer nas cores do editor, mexa nas seguintes configurações #Background -> style.au3.32=style.*.32=$(font.base),back:#F0F4F9 # CaretLineBackground -> caret.line.back= # Brace highlight -> style.au3.34= # Brace incomplete highlight -> style.au3.35= # White space -> style.au3.0= # Comment line -> style.au3.1= # Comment block -> style.au3.2= # Number -> style.au3.3= # Function -> style.au3.4= # Keyword -> style.au3.5= # Macro -> style.au3.6= # String -> style.au3.7= # Operator -> style.au3.8= # Variable -> style.au3.9= # Sent keys -> style.au3.10= # Pre=Processor -> style.au3.11= # Special -> style.au3.12= # Abbrev=Expand -> style.au3.13= # Com Objects -> style.au3.14= # Standard UDF's -> style.au3.15= As minhas cores são basicamente o padrão, porém eu gosto de usar uma cor amarela para realçar a linha atual que estou trabalhando. Então eu mexi na linha caret.line.back=#FFFA2B Se fizer isto por detro do prório editor, ao pressionar Ctrl S para salvar, a mudança aparece na hora. Para ajudar a selecionar cores e os seus códigos eu recomendo 2 sites, onde vc pode selecionar as cores e copiar o código hexa ou informar o código hexa e ver a cor desejada: https://www.colorschemer.com/color-picker/ https://www.rapidtables.com/web/color/RGB_Color.html
  5. 2 points
    Consegui colocar Mute e Volume neste que usa a Ole32.dll e agora já dá prá incluir ele na minha lista de players também. Func IMediaControl_Mute(ByRef $IGraphBuilder, $opt = 0) If $opt = 0 Then IMediaControl_Vol($IGraphBuilder, $volume); 100 para volume total Else IMediaControl_Vol($IGraphBuilder, 0) EndIf GUICtrlSetData($lab_mute, "Mute: " & $opt) EndFunc ;==>IMediaControl_Mute Func IMediaControl_Vol(ByRef $IGraphBuilder, $vol = 50); Faltando $IMediaControl = GetIMediaControl($IGraphBuilder) If @error Then Return SetError(1, 0, False) ;-------IMediaControl Vol Virtual Method Number Is 46;---------------- $Rt = InterfaceCall($IMediaControl, "long", 46, "long", -Exp((100 - $vol) / 10.86)) ;-------IMediaControl Vol Virtual Method Number Is 46;---------------- GUICtrlSetData($lab_vol, "Vol: " & $vol) If @error Or $Rt[0] <> 1 Then CtrlGraphRelease($IMediaControl) Return SetError(2, 0, False) EndIf Return SetError(0, 0, True) EndFunc ;==>IMediaControl_Vol _DirectShow_Ole32.au3
  6. 2 points
    Embora o ultimo post foi de 2017 e vi o codigo apenas agora Muito bom a UDF. Criei um script pra testar e ficou legal Notei que as vezes ao passar o mouse o efeito vem acompanhado de alguns blinks Adicionei uma função de sleep (_HighPrecisionSleep) na UDF mas não consegui eliminar totalmente o blink #include "BackEffect.au3" #include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <WinAPI.au3> #include <UDF_AnimateWindow.au3> #cs ---------------------------------------------------------------------------- AutoIt Version: 3.3.14.5 Author: Rodrigo Chaves Script Function: Popup Exemplo 2 11/2019 #ce ---------------------------------------------------------------------------- ;Variavel de dimensionamento Dim Const $iW = 610, $iH = 430 ;Variavel para arrendondamento das bordas da janela e dimensionamento do botao fechar Dim Const $iC = 25 Dim Const $iC2 = 8 ;0 = Quadrado / 8 = Quadrado com cantos arredondados / 16 = Quase circular / 32 = Circulo ;Variavel para controle do MouseHover Dim $fOver0 = False, $fOver1 = False, $fOver2 = False ;/Tabela de cores Dim $tSTRUCTCOLOR = 'struct;char white[8];char alpha[2];char blueCustom[8];char blue[8];char dark[8];char red[8];char gray[8];endstruct' Dim $oColor = DllStructCreate($tSTRUCTCOLOR) DllStructSetData($oColor, 'blueCustom', 0x006BB7) DllStructSetData($oColor, 'blue', 0x01558C) DllStructSetData($oColor, 'white', 0xFFFFFF) DllStructSetData($oColor, 'alpha', -2) DllStructSetData($oColor, 'dark', 0x252525) DllStructSetData($oColor, 'red', 0xD61425) DllStructSetData($oColor, 'gray', 0xD1D1D1) ;// ;Cria o Popup Dim Const $hWnd_Main = GUICreate("", $iW, $iH, -1, -1, $WS_POPUP) GUISetBkColor($oColor.blueCustom) $aGetPos = WinGetPos($hWnd_Main) ;Arredonda os cantos da form Dim Const $hRegion = _WinAPI_CreateRoundRectRgn(0, 0, $iW, $iH, $iC, $iC) _WinAPI_SetWindowRgn($hWnd_Main, $hRegion) Dim $idBtn_Ok = GUICtrlCreateLabel("Ok", 410, 369, 75, 25, BitOR($SS_CENTER, $SS_CENTERIMAGE)) GUICtrlSetBkColor(-1, $oColor.dark) GUICtrlSetColor(-1, $oColor.white) Dim $idBtn_Cancel = GUICtrlCreateLabel("Cancelar", 500, 369, 75, 25, BitOR($SS_CENTER, $SS_CENTERIMAGE)) GUICtrlSetBkColor(-1, $oColor.dark) GUICtrlSetColor(-1, $oColor.white) ;Aplica efeito de entrada WinAPI_AnimateWindow($hWnd_Main, 'explode', 350) GUISetState(@SW_SHOW) ;/Cria o botao close Dim Const $hWnd_Close = GUICreate('', $iC, $iC, $aGetPos[2] - 35, 10, $WS_POPUP, $WS_EX_MDICHILD, $hWnd_Main) ;Arredonda os cantos da form Dim Const $hRegion_ = _WinAPI_CreateRoundRectRgn(0, 0, $iC, $iC, $iC2, $iC2) _WinAPI_SetWindowRgn($hWnd_Close, $hRegion_) ;Define a cor de fundo GUISetBkColor($oColor.dark) ;/Cria o botao X Dim $idBtn_Close_C = GUICtrlCreateLabel('X', 0, 0, $iC - 1, $iC - 1, BitOR($SS_CENTER, $SS_CENTERIMAGE)) GUICtrlSetFont(-1, 11, 400, 0, 'Segoe UI', 0) GUICtrlSetBkColor(-1, $oColor.dark) GUICtrlSetColor(-1, $oColor.white) ;// ;Executa a animacao de entrada WinAPI_AnimateWindow($hWnd_Close, 'explode', 300) ;Exibe a form GUISetState(@SW_SHOW) WinActivate($hWnd_Main) ;// ;Altera os estilos da form GUISetStyle(-1, $WS_EX_COMPOSITED, $hWnd_Main) ;Registra uma funcao definida para um Windows Message ID (WM_MSG) conhecido GUIRegisterMsg($WM_NCHITTEST, "_WM_NCHITTEST") ;Habilita o efeito nos controles __BackEffectStart($hWnd_Main, $oColor.gray) ;Adiciona o efeito no botao $idBtn_Ok AddBack_Effect($hWnd_Main, $idBtn_Ok, 3) ;Adiciona o efeito no botao $idBtn_Cancel AddBack_Effect($hWnd_Main, $idBtn_Cancel, 3) While 1 ;Identifica a posicao do mouse sobre a form _MouseHover() $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE, $idBtn_Close_C Exit Case $idBtn_Ok MsgBox(262144 + 0, 'Debug', 'Botao Ok pressionado', 0, $hWnd_Main) Case $idBtn_Cancel MsgBox(262144 + 0, 'Debug', 'Botao cancelar pressionado', 0, $hWnd_Main) Exit EndSwitch WEnd ;Retorna a posicao do mouse relativa a Form Func _MouseHover() $aCInfo = GUIGetCursorInfo($hWnd_Main) ;/Button Ok If $aCInfo[4] = $idBtn_Ok Then If $fOver0 = False Then GUICtrlSetBkColor($idBtn_Ok, $oColor.blue) GUICtrlSetColor($idBtn_Ok, $oColor.white) $fOver0 = True EndIf Else If $fOver0 = True Then GUICtrlSetBkColor($idBtn_Ok, $oColor.dark) GUICtrlSetColor($idBtn_Ok, $oColor.gray) $fOver0 = False EndIf EndIf ;// ;/Button Cancel If $aCInfo[4] = $idBtn_Cancel Then If $fOver1 = False Then GUICtrlSetBkColor($idBtn_Cancel, $oColor.red) GUICtrlSetColor($idBtn_Cancel, $oColor.white) $fOver1 = True EndIf Else If $fOver1 = True Then GUICtrlSetBkColor($idBtn_Cancel, $oColor.dark) GUICtrlSetColor($idBtn_Cancel, $oColor.gray) $fOver1 = False EndIf EndIf ;// $aCInfo = GUIGetCursorInfo($hWnd_Close) ;/Button Close If $aCInfo[4] = $idBtn_Close_C Then If $fOver2 = False Then GUICtrlSetBkColor($idBtn_Close_C, $oColor.red) GUICtrlSetColor($idBtn_Close_C, $oColor.white) $fOver2 = True EndIf Else If $fOver2 = True Then GUICtrlSetBkColor($idBtn_Close_C, $oColor.dark) GUICtrlSetColor($idBtn_Close_C, $oColor.gray) $fOver2 = False EndIf EndIf ;// EndFunc ;==>_MouseHover ;Habilita o movimento da form de qualquer ponto de referencia Func _WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam) ;https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-nchittest #forceref $hWnd, $iMsg, $iwParam, $ilParam If $iMsg = $WM_NCHITTEST Then Return $HTCAPTION EndFunc ;==>_WM_NCHITTEST Abaixo eu anexei a UDF com a função _HighPrecisionSleep adicionada E a UDF AnimateWindow que não vem na instalação do Autoit mas esta presente nesse código de exemplo BackEffect.au3 UDF_AnimateWindow.au3
  7. 2 points
    Olá, Compartilhando um script de efeitos de entrada e saída de GUI utilizando a função _WinAPI_AnimateWindow Deve ser usado junto com GUISetState() #cs ---------------------------------------------------------------------------- AutoIt Version: 3.3.14.5 Author: Rodrigo Chaves Script Function: Animate Window 07/2019 Base de pesquisa https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-animatewindow #ce ---------------------------------------------------------------------------- #include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <WinAPIDiag.au3> ;Variaveis de efeitos Dim Const $tSTRUCT = 'struct;char fadeIn[128];char fadeOut[128];char Slide_In_Left[128];char Slide_Out_Left[128];char Slide_In_Right[128];char Slide_Out_Right[128];char Slide_In_Top[128];char Slide_Out_Top[128];' & _ 'char Slide_In_Bottom[128];char Slide_Out_Bottom[128];char DiagSlide_In_TopLeft[128];char DiagSlide_Out_TopLeft[128];char DiagSlide_In_TopRight[128];char DiagSlide_Out_TopRight[128];' & _ 'char DiagSlide_In_BottomLeft[128];char DiagSlide_Out_BottomLeft[128];char DiagSlide_In_BottomRight[128];char DiagSlide_Out_BottomRight[128];char explode[128];char implode[128];endstruct' Dim $oAW = DllStructCreate($tSTRUCT) $oAW.fadeIn = 0x00080000 $oAW.fadeOut = 0x00090000 $oAW.slide_In_Left = 0x00040001 $oAW.slide_Out_Left = 0x00050002 $oAW.slide_In_Top = 0x00040004 $oAW.slide_Out_Top = 0x00050008 $oAW.slide_In_Right = 0x00040002 $oAW.slide_Out_Right = 0x00050001 $oAW.slide_In_Bottom = 0x00040008 $oAW.slide_Out_Bottom = 0x00050004 $oAW.diagSlide_In_TopLeft = 0x00040005 $oAW.diagSlide_Out_TopLeft = 0x0005000a $oAW.diagSlide_In_TopRight = 0x00040006 $oAW.diagSlide_Out_TopRight = 0x00050009 $oAW.diagSlide_In_BottomLeft = 0x00040009 $oAW.diagSlide_Out_BottomLeft = 0x00050006 $oAW.diagSlide_In_BottomRight = 0x0004000a $oAW.diagSlide_Out_BottomRight = 0x00050005 $oAW.explode = 0x00040010 $oAW.implode = 0x00050010 ;Verificar a estrutura da variavel ;~ _WinAPI_DisplayStruct($oAW, $tSTRUCT) ;Variaveis de cores Dim Const $tagSTRUCT = 'struct;char white[8];char black[8];char dark[8];char light[8];char darkLight[8];char aqua[8];char alpha[2];endstruct' Dim $oColor = DllStructCreate($tagSTRUCT) $oColor.white = 0xFFFFFF $oColor.black = 0x000000 $oColor.dark = 0x202020 $oColor.light = 0xf5f6f7 $oColor.darkLight = 0x323232 $oColor.aqua = 0x00f2ff $oColor.alpha = -2 ;Verificar a estrutura da variavel ;~ _WinAPI_DisplayStruct($oColor, $tagSTRUCT) ;Texto de exemplo Dim $sSampleText = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor ' & _ 'incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud ' & _ 'exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure ' & _ 'dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur ' & _ 'sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.' $hWnd_Main = GUICreate("", 615, 437, -1, -1, $WS_POPUPWINDOW, $WS_EX_TOPMOST) GUISetBkColor($oColor.dark) $aGetPos = WinGetPos($hWnd_Main) $sLabel_Title = GUICtrlCreateLabel(" Exemplo de janela animada", 0, 0, $aGetPos[2] - 2, 17, $SS_CENTERIMAGE, $GUI_WS_EX_PARENTDRAG) GUICtrlSetFont(-1, 10, 400, 0, "Segoe UI") GUICtrlSetBkColor(-1, $oColor.darkLight) GUICtrlSetColor(-1, $oColor.white) $Label2 = GUICtrlCreateLabel($sSampleText, 35, 40, 546, 337) GUICtrlSetFont(-1, 11, 400, 0, "Segoe UI") GUICtrlSetColor(-1, $oColor.white) $idBtn_Run = GUICtrlCreateButton("Run Effect", 430, 385, 75, 25) $idBtn_Exit = GUICtrlCreateButton("Exit", 510, 385, 75, 25) GUISetState(@SW_SHOW) ;Cria um sublinhado na barra de titulo $lineGraphic = GUICtrlCreateGraphic(0, 18, $aGetPos[2] - 1, 1) GUICtrlSetBkColor(-1, $oColor.aqua) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE, $idBtn_Exit Exit Case $idBtn_Run GUICtrlSetState($idBtn_Run, $GUI_HIDE) GUISetState(@SW_HIDE, $hWnd_Main) Sleep(1500) For $i = 1 To 20 ;Coleta o valor da variavel da estrutura $oAW $getAW = DllStructGetData($oAW, $i) ;Aplica o efeito _WinAPI_AnimateWindow($hWnd_Main, $getAW, 300) Sleep(200) Next ;Aplica o efeito de entrada fade-in com tempo de entrada de 1s (1000ms) _WinAPI_AnimateWindow($hWnd_Main, $oAW.fadeIn, 1000) ;Recolore o sublinhado GUICtrlSetBkColor($lineGraphic, $oColor.aqua) GUISetState(@SW_SHOW) GUICtrlSetState($idBtn_Run, $GUI_SHOW) EndSwitch WEnd
  8. 1 point
    Esqueci de anexar SecurityEx.au3
  9. 1 point
    Agora vou falar sobre alguns programas externos que eu uso diariamente, que me ajudam um monte ao fazer minhas tarefas. 1) WInMerge = https://winmerge.org/ O WinMerge é um comparador de arquivos. Sua principal função é comparar arquivos estilo TXT (como scripts) e mostrar as diferenças entre eles. Serve também para quaisquer outros tipos de arquivos, mas nos arquivos estilo TXT é que ele mostra sua força. Quer comparar 2 fontes? Quer comparar 2 arqs INI? Quer comparar sei lá o que? WinMerge te ajuda. Ele mostra linha a linha as diferenças e ainda permite que vc copie de um lado para outro se vc quiser. Compara até pastas, informando quais arquivos são iguais e quais são diferentes. E quando vc escolhe um arquivo, ele detalha como expliquei acima. 2) GrepWin = https://tools.stefankueng.com/grepWin.html Para efetuar pesquisas dentro dos arquivos, o GrepWin é fantástico. Eu uso muito para encontrar referências dentro dos scripts da pasta Include por exemplo, mas ele serve para qualquer tipo de pesquisa. É só clicar com o botão direito na pasta que vc quer procurar e informar o que procurar que ele sai vasculhando. Tem pesquisa Regex, mostra os arquivos e trechos onde achou o item pesquisado e até mesmo pode ser usado para REPLACE. 3) Everything = https://www.voidtools.com/ Sabe aquele search de arquivos do Windows que leva uma eternidade para localizar o que vc quer? Mande pro inferno... O Everything é extremamente rápido e encontra tudo que vc quiser em questão de segundos (se não antes). Precisa procurar um arquivo pelo nome? Mesmo parcial? Não sabe qual pasta ele está? Vc sabe quantos arquivos .MP3 vc tem? Ou .JPG? A medida que vc vai digitando os nomes na barra de pesquisa, ele vai filtrando os resultados. Por exemplo: .PDF - mostra todos os PDFs que tem na máquina .PDF jorge - mostra todos os PDFs que tem o nome jorge (em qualquer llugar do nome) .PDF jorge contratos\ - mostra todos os PDFs com o nome jorge na pasta contratos E assim por diante. Com os recursos de AND, OR e NOT, vc tem um poderoso procurador de arquivos instantâneo! Outro ponto positivo, no português brasil, é que ele ignora acentos e cedilha. Assim ao procurar "declaracao" ele acha "declaração" tbm!! Mesmo assim, para procurar DENTRO dos arquivos, ainda recomendo o GrepWin ou o FileSearchy (como 2a opção). 4) Ditto = https://ditto-cp.sourceforge.io/ Um gereciador de clipboard. Não sabe o que é isso? Lembra do copia-e-cola? CTRL-C e CTRL-V que usamos diariamente? Pois é, pense nisso como um turbinador dessa função. Com o Ditto, vc pode guardar até os últimos 500 recortes. Sabe quando vc copiou um trecho de alguma coisa e entre uma coisa e outra ao colar, colou outra coisa que vc copiou nesse meio tempo? Pois é. Com o Ditto, vc pode recuperar o que foi copiado, sem precisar copiar de novo! Nunca pensei que usaria um destes. Até fui muito resistente a instalar este programa. Hoje não vivo mais sem ele! Não muda nada no CTRL-C e CTRL-V normal, mas facilmente vc pode olhar, selecionar e até pesquisar os últimos CTRL-C que foram feitos e o melhor, reaproveitá-los! Hoje eu uso para salvar senhas da repetição, códigos, informações que posso usar depois. É muito prático. E daí O que acharam? Tem outras recomendações? Eu uso mais uma penca de aplicativos aqui... Inclusive vários eu cobro para instalar/configurar para os meus colegas advogados (hehehehe)
  10. 1 point
    Olá. Para o SO (sistema operacional), um arquivo precisa se encaixar nas definições de um programa executável quando: termina com a extensão .COM ou .EXE ou .BAT (arquivo auxiliar) ou .CMD (arquivo auxiliar mais novo) ou qualquer outra reconhecida pelo SO obedece alguns critérios técnicos (como identificação do PE, Data table definida, etc) específico para cada tipo de arquivo existem prerrogativas de segurança para executar o arquivo (usuário, regras, controle de domínio, etc) Finalmente se todas estes pré-requisitos forem observados, o arquivo será executado, ou seja, é carregado na memória e transferido o controle à primeira instrução dele. Portanto, o arquivo executável é exatamente como outro arquivo qualquer dentro do computador, seja ele uma foto, uma música, um vídeo, um documento... A única diferença que existe é que em vez de ser um arquivo tipo secundário (que precisa de um outro programa para utlizar), ele pode ser uma extensão (nativa ou não) do SO. Infelizmente aqui no Brasil, nossos procedimentos de segurança não são lá grande coisa e por uma questão cultural nos acostumamos a ser sempre o proprietário, dono e senhor do computador e seus programas, inclusive o SO. Isto inclusive explica a nossa resistência, enquando sociedade a não pagar pelos programas que utilizamos. Fica difícil se preocupar com se nossos scripts serão ou não copiados ou descompilados, numa clara preocupação com nossos direitos autorais, aprendizado e esforços, porém na maioria dos casos, desrespeitamos os direitos autorais dos outros sem discriminação, ao piratear um Windows, um Office ou qualquer outro software do mercado. Mas, tirando esta questão da frente e nos focando no problema em questão, a trava no executável (se houvesse), deveria ser de responsabilidade que quem o criou e não do SO. O próprio programa, poderia em sua inicialização, deveria fazer um auto-diagnóstico e caso se identifique identificado, se auto-encerra. Porém esta abordagem traz algumas dificuldades técnicas: muitos desenvolvedores não se preocupariam com este auto-diagnóstico (preguiça) a verificação só pode acontecer com um código de segurança, checksum por exemplo, se este mesmo checksum for externo, pois não há como inserir um checksum no meu próprio programa sem alterar o valor do próprio checksum. Se fosse um checksum parcial, abre uma brecha para modificação, daí não serve (impossibildade técnica) finamente, se o programa se auto-diagnosticar como infectado, mesmo que ele auto-encerre, o objetico do vírus já foi alcançado, pois o vírus vem antes do programa, então no momento que o programa se verifica bichado, é porque o vírus já foi para a memória (atraso) A partir daí, para evitar esta situação, seria necessário que o SO fizesse uma verificação antes de carregar o programa, que aliás isto não é tarefa dele (SO), mas do sistema de segurança (AVs). Assim mostramos que mesmo que haja um mecanismo de auto-bloqueio, ele seria inútil por parte do desenvolvedor. E confiar em um software de segurança, por melhor que ele seja, sempre haverá exceções, falhas, janelas de reconhecimento, etc, ou seja, não há como evitar uma virose surja e se instale. Porém podemos e devemos tomar algumas medidas protetivas que não só protegem os programas mas também o ambiente que trabalham (SO): manter nosso SO atualizado, limpo e não corrompido usar programas de segurança confiáveis e comprovadamente eficazes (ou no mínimo que sejam menos furados!!!!) utilizar softwares somente de fontes confiáveis ou verificáveis (quase impossível) utilizar as prerrogativas de segurança do próprio SO, como usuários limitados e restrições de segurança de arquivos bloquear os arquivos executáveis para serem apenas lidos e/ou executados mas nunca gravados ou modificados (com restrições de gravação e não atributo RO) aceitar as restrições De qualquer maneira, depende muito mais do usuário (e das configurações aplicadas no computador) do que propriamente do desenvolvedor. E mesmo assim, existe a possibildade de uma infecção acontecer devido a fatores ainda desconhecidos. Posso citar aqui como exemplos: erro do caminho da DLL: ao fazer a chamada a uma DLL (coisa comum em programas), foi descoberto que havia um erro na chamada do SO e se houvesse uma DLL com o mesmo nome na mesma pasta do programa, esta seria chamada em detrimento à DLL original pretendida modificação do processo de carregamento: muito utilizado pelos vírus envelopadores ou até mesmo os teimosos mesmo, resulta de uma modificação do mecanismo de chamada do executável (por exemplo mudança no registro) de tal forma que quando qualquer executável seja chamado, uma nova cópia do vírus é executada antes do programa original injeção de DLL ou SQL: quando um malware se auto-coloca em uma seção de memória de um programa conhecido, de tal forma que o programa original ao chamar esta porção de código, execute o vírus e tem mais trocentos exemplos... Como disse o @mutleey, as instruções são inseridas em código de máquina e a qualquer momento possível onde haja uma brecha para tal. A última ideia do @Belini é a mais correta de se usar atualmente, porém demanda que o usuário aceite as restrições impostas a ele para sua própria proteção, o que culturalmente nunca vai ocorrer por livre e espontâna vontade. Veja o caso que estamos falando onde o usuário não usa o AV porque não deia ele trabalhar. O problema é tão grande que ele (usuário) não percebe o absurdo da situação e ainda reclama do AV, que está tentando ajudar. Finalmente, tem vários softwares de segurança que ao fazerem a varredura, montam seus próprios checksum (CRC) para identificarem quando houve alterações nos programas e a partir daí, conseguirem bloquear as infecções futuras. Porém o mesmo remédio que ajuda, também atrapalha, pois mudanças legítimas nos progamas (versões novas por exemplo) não são aceitas. E se o software perguntar se houve uma alteração e se o usuário confirma a modificação (até para substituir pelo novo checksum), é o espaço de abertura necessário para um malware se instalar, e por onde passa boi, passa boiada!!!! Mas e o que vc acham? Teríamos como poteger mais nosso sistemas (progs e SO)???
  11. 1 point
    @Belini Em teoria, vc deixar o arquivo sem extensão poderia ser uma solução no seu caso, onde os programas são chamados por você através do Run. Em termos genéricos não resolve o problema dele. Mas isso pode depender de onde o vírus fez seu gatilho, se na chave do registro do arquivo tipo .EXE ou na chamada de execução do SO para eecutáveis. Se for no registro, este método resolve. Mas é inacreditável que um cara esteja tão "sujo" que não percebe a situação ridícula que se colocou, a ponto do AV "não deixar ele trabalhar"! Caramba! @mutleey A ideia é boa, eu mesmo utilizo em alguns clients esta mesma técnica, mas o ideal é desativar o autorun geral, pois caso algun pendrive estranho (ou sem a pasta) apareça, daí recomeça o ciclo de infecção. Uma outra técnica que existe, quando vc não quer ativar o autorun para um determinado dispositivo (pendrive ou HD) é segurar o SHIFT enquanto espeta o dispositivo. Mantendo o SHIFT pressionado diz pro SO não ativar o autorun para aquele dispositivo. Segue um arquivo de registro que eu uso para desativar os autorun de todos os drives. AutoPlay for all drives - Disable.reg
  12. 1 point
    Muito boa idéia @Manimal realmente tem alguns macetes que ajudam muito e as vezes passam desapercebidos!
  13. 1 point
    Olá. Para converter seu script basta informar a pasta raiz onde estão armazenados os seus scripts e mandar ver. Eles serão convertidos para o padrão UTF-8 with BOM, com vários benefícios. Não esqueça de fazer uma cópia dos seus arquivos ANTES da conversão pois se der alguma coisa errada, poder fazer novamente (se ainda quiser). #include <File.au3> #include <Array.au3> #include <FileConstants.au3> #include <MsgBoxConstants.au3> If not CONVERSOR_ENCODING("C:\Scripts") Then MsgBox($MB_OK, "Erro", "Problemas ao converter os cripts") EndIf Func CONVERSOR_ENCODING ($sPasta, $nEncoding = $FO_UTF8) If IsKeyword($nEncoding) Then $nEncoding = $FO_UTF8 Local $aArquivos = _FileListToArrayRec($sPasta, "*.au3", $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_NOSORT, $FLTAR_FULLPATH) If @error Then Return SetError(1, 0, False) ConsoleWrite($sPasta & @CRLF) Local $sConteudo, $hArquivo, $nOld_Encoding = -1, $nNew_Encoding = -1, $sAtributos = "", $bMudou_Atributo = False For $nArquivo = 1 to $aArquivos[0] $bMudou_Atributo = False $nOld_Encoding = FileGetEncoding($aArquivos[$nArquivo]) $sAtributos = FileGetAttrib($aArquivos[$nArquivo]) If StringInStr($sAtributos, "R") Then $bMudou_Atributo = True FileSetAttrib($aArquivos[$nArquivo], "-R") EndIf If $nOld_Encoding = $nEncoding Then ConsoleWrite("> ") Else ConsoleWrite("! ") $sConteudo = FileRead($aArquivos[$nArquivo]) FileDelete($aArquivos[$nArquivo]) $hArquivo = FileOpen($aArquivos[$nArquivo], $FO_OVERWRITE + $nEncoding) ConsoleWrite(FileWrite($hArquivo, $sConteudo) & " ") FileClose($hArquivo) EndIf If $bMudou_Atributo Then FileSetAttrib($aArquivos[$nArquivo], "+R") $nNew_Encoding = FileGetEncoding($aArquivos[$nArquivo]) ConsoleWrite(StringFormat("%-100s", $aArquivos[$nArquivo]) & " = " & NOME_ENCODING($nOld_Encoding) & " => " & NOME_ENCODING($nNew_Encoding) & @CRLF) Next Return SetError(0, 0, True) EndFunc ;==>CONVERSOR_ENCODING Func NOME_ENCODING ($nCode) Local $aNomes = [ [ $FO_UTF16_LE, "UTF16 Little Endian" ], _ [ $FO_UTF16_BE, "UTF16 Big Endian" ], _ [ $FO_UTF8, "UTF8 (with BOM)" ], _ [ $FO_UTF8_NOBOM, "UTF8 (without BOM)" ], _ [ $FO_ANSI, "ANSI (containing char > 127 and < 255)" ] ] Local $nPosicao = _ArraySearch($aNomes, $nCode) If @error Then Return SetError(1, 0, "NÃO ENCONTRADO") Return SetError(0, 0, StringFormat("%40s", $aNomes[$nPosicao][1])) EndFunc
  14. 1 point
    @Luigi e @Manimal Com as alterações que fiz na minha Gif pude usar a UDF que vc's indicaram e agora não dá mais oscilações na tela, obrigado pela indição da UDF que deram.
  15. 1 point
    @Belini, dá um olhada... Achei essa UDF e fiz uns testes... Alterne o comentário das linhas 12 e 13. teste_com_gif.7z Agora eu vi que postei a mesma UDF que o @Manimal postou... Tem realmente que ser um GIF? Não pode ser um PNG com várias imagens? Como se fosse um GIF?
  16. 1 point
    Olá, desculpe cair na conversa de paraquedas... @Belini Rotação de imagem e redimensionamento, eu consegui mas sempre usando a função _GDIPlus_MatrixCreate() Até hoje acho que não entendi direito, e de tanto tentar, até consegui alguns efeitos interessantes. Veja este outro exemplo com a função _GDIPlus_GraphicsScaleTransform() Outra opção, é usar o IrrLicht, faz o cão com GIF, GIF animado... Mas são dois conjuntos de funções: AutoIT (com botões tradicionais) e IrrLicht (com botões gráficos).
  17. 1 point
    as versões mais novas do AutoiT a variavel $ghGDIPDll tem que ser renomeada para $__g_hGDIPDll
  18. 1 point
    Acaba que desmembrei a gif e editei os quadros daí deu prá fazer a animação com .bmp mesmo. #include <StaticConstants.au3> #include <WindowsConstants.au3> Global $hGUI, $pic_img, $conta = 1 $hGUI = GUICreate("Animation", 378, 200, -1, -1, $WS_POPUP, $WS_EX_TOPMOST) GUISetBkColor(0xffffff) GUISetState() $pic_img = GUICtrlCreatePic(@ScriptDir & "\image_1.bmp", 0, 0, 378, 200, $SS_CENTERIMAGE) AdlibRegister("Img_animate", 100) HotKeySet("{Esc}", "Sair") While 1 Sleep(1000) WEnd Func Img_animate() $conta += 1 If $conta > 3 Then $conta = 0 GUICtrlSetImage($pic_img, @ScriptDir & "\image_" & $conta & ".bmp") EndFunc ;==>Img_animate Func sair() Exit EndFunc ;==>sair Animation.rar
  19. 1 point
    Olá Belini. Achei que vc já tivesse alguma. Segue a que eu uso. Só precisa ajustar o tamanho da janela ao tamanho do gif (se necessário). #include <GUIConstants.au3> #include "GIFAnimation.au3" #include <FileConstants.au3> #include <WindowsConstants.au3> Local $sPastaDestino = @ScriptDir, $sArquivoGIF = "\Hello.gif" If @Compiled Then $sPastaDestino = @TempDir FileInstall(@ScriptDir & $sArquivoGIF, $sPastaDestino & $sArquivoGIF, $FC_OVERWRITE) Else If not FileExists($sPastaDestino & $sArquivoGIF) Then ConsoleWrite("GIF não existe" & @CRLF) Exit EndIf EndIf Local $hWnd_Janela = GUICreate("Atualizando multimídia...", 220, 206, -1, -1, $WS_EX_TOOLWINDOW) Local $hGIF = _GUICtrlCreateGIF($sPastaDestino & $sArquivoGIF, "", 0, 0) If not @error Then GUISetState(@SW_SHOW) Sleep(5000) _GIF_DeleteGIF($hGIF) EndIf GUIDelete($hWnd_Janela) If @Compiled Then FileDelete($sPastaDestino & $sArquivoGIF) GIFAnimation.au3
  20. 1 point
    @Rodrigo Chaves Neto, valeu! Eu sei que em alguns campos o efeito não é o esperado, pois na verdade, o efeito de background é um GuiCtrlCreateLabel "colorido" que fica por trás dos controles (GuiCtrlCreateButton, GuiCtrlCreateInput, etc). É como se fosse um CSS, com um elemento por cima do outro, e o debaixo, vai "perdendo" a cor, até se misturar com o fundo. Acredito nem todos os campos de entrada de dados foram não construídos com o mesmo rigor. Por isso, as vezes tem algum efeito rebelde... Ou foi falta de conhecimento da minha parte mesmo. 8D
  21. 1 point
    @Manimal testei usano o comando "VACUUM INTO" e melhorou demais a velcidade para criar o banco de dados, obrigado mais uma vez!
  22. 1 point
    Buenas! Sempre que falamos em clonar um banco em memória, nosso objetivo é melhorar o tempo de resposta para funções de massa, como grandes e complexas consultas por exemplo, que talvez ao serem efetuadas a partir do disco (BD original) possam resultar bem mais lentas para apresentar os resultados. Grandes alterações no banco como inserção em massa de dados, alterações ou exclusões também podem ocorrer. Então, ao clonarmos o BD para a memória, temos que ter em mente que eventuais alterações feitas na memória podem ter 2 (dois) destinos: são ignoradas, ou seja o BD serve apenas para SELECTs e o que vale é o BD em disco; precisam ser salvas, ou seja, em algum momento, precisam ser descarregadas/efetivadas/replicadas em disco. Na opção 1, o problema está resolvido. Ignora-se o BD em memória e tudo bem! Na opção 2 o buraco é bem mais embaixo. Aqui temos novamente 2 (duas) possibilidades: efetivamos as alterações à medida que acontecem! Pessoalmente é a que eu utilizo por algumas razões: mantenho o BD em memória igual ao BD no disco (sincronização); caso ocorra alguma falha no equipamento (reset, falta de luz, travamento, etc) as alterações estão seguras; ao iniciar o script, carrego novamente o BD em memória, sabendo que é a última versão das informações e parto disto; não preciso me preocupar em descarregar as alterações posteriormente (no final do programa ou em algum ponto definido) e neste momento qualquer ganho de tempo que eu tive, foi por água abaixo, pois o tempo de gravação em disco de todas as alterações é enorme. Como fazemos isso? Após a clonagem do BD em memória, qualquer alteração ao ser executada, deve ser feita tanto em memória como em disco. #include <Sqlite.au3> ; incializa SQLite _SQLite_Startup() ; Abre BD em mmória Local $hBD_Mem = _SQLite_Open() ; Abre BD em disco Local $hBD_Disco = _SQLite_Open(@ScriptDir & "\BancoDeDados.db") ; ... ; Faz a clonagem conforme as técnicas explicadas em post anterior ; ... ; faz as eventuais alterações no BD mem e no BD disco _SQLite_Exec($hBD_Mem, "UPDATE Tabela SET Estado = "SC" WHERE Codigo = 425;") _SQLite_Exec($hBD_Disco, "UPDATE Tabela SET Estado = "SC" WHERE Codigo = 425;") ; faz as eventuais alterações no BD mem e no BD disco _SQLite_Exec($hBD_Mem, "DELETE FROM Tabela WHERE Idade < 18;") _SQLite_Exec($hBD_Disco, "DELETE FROM Tabela WHERE Idade < 18;") ; fecha tudo _SQLite_Close() _SQLite_Shutdown() Desta forma, mantemos os dois bancos de dados iguais e atualizados. E quaisquer consultas (SELECTs) devem ser feitos diretamente no BD em memória para obter um ganho considerável de velocidade! A outra possibilidade envolve não manter os 2 (dois) bancos equiparados ou sincronizados, mas fazer as alterações somente em memória e depois de tudo pronto, descarregar o BD da memória em disco. Este procedimento pode ser feito a qualquer momento, mas normalmente é efetivado na saída do programa (final do script). Para tanto, infelizmente não há um comando ou comandos que possam fazer isto rapidamente. Felizmente a partir da versão 3.6.x do SQLite, foi implemntadado a API de Backup, que permite fazer cópia do banco "on-the-fly" (com o banco aberto e operando). No fórum americano, tem um tópico sobre isto (cortesia do Belini que achou) e também tem uma função para fazer o backup: Se quiser ver o tópico original = https://www.autoitscript.com/forum/topic/108151-sqlite-backup-api-wrapper/ Vou anexar aqui uma versão modificada da original, já contendo as alterações sugeridas pelos integrantes do fórum naquele tópico e com algumas modificações minhas também. Para utilizar a função de Backup é bem simples. Segue exemplo: #include <Sqlite.au3> #include "sqlitebackup.au3" ; incializa SQLite _SQLite_Startup() ; Abre BD em mmória Local $hBD_Mem = _SQLite_Open() ; Abre BD em disco Local $hBD_Disco = _SQLite_Open(@ScriptDir & "\BancoDeDados.db") ; ... ; Faz a clonagem conforme as técnicas explicadas em post anterior ; ... ; faz as eventuais alterações SOMENTE na memória _SQLite_Exec($hBD_Mem, "UPDATE Tabela SET Estado = "SC" WHERE Codigo = 425;") ; faz as eventuais alterações SOMENTE na memória _SQLite_Exec($hBD_Mem, "DELETE FROM Tabela WHERE Idade < 18;") ; faz o backup do BD em memória de volta para o disco (recomendado ao final do script) _SQLite_Backup($hBD_Mem, @ScriptDir & "\BancoDeDadosCOPIA.db") ; fecha tudo _SQLite_Close() _SQLite_Shutdown() Mas conversando com um outro colega (meu ex-orientandor de mestrado) que é DBA, ele me comentou que alguns engines DBs aproveitam comandos de manutenção do banco (que exigem controle total sobre o mesmo) para efetivar algum tipo de cópia. Assim, fui pesquisar na documentação do SQLite e o comando VACUUM, que serve para fazer uma lmpeza interna do banco, a partir da versão 3.27 possui uma cláusula INTO que faz exatamente isto! Agora temos 2 (duas) opções de salvar o banco de dados da memória em disco. Faca os testes e veja qual a melhor (ou a mais rápida) que serve para o seu caso. A vantagem é que não precisa de uma função externa. #include <Sqlite.au3> ; incializa SQLite _SQLite_Startup() ; Abre BD em mmória Local $hBD_Mem = _SQLite_Open() ; Abre BD em disco Local $hBD_Disco = _SQLite_Open(@ScriptDir & "\BancoDeDados.db") ; ... ; Faz a clonagem conforme as técnicas explicadas em post anterior ; ... ; faz as eventuais alterações SOMENTE na memória _SQLite_Exec($hBD_Mem, "UPDATE Tabela SET Estado = "SC" WHERE Codigo = 425;") ; faz as eventuais alterações SOMENTE na memória _SQLite_Exec($hBD_Mem, "DELETE FROM Tabela WHERE Idade < 18;") ; faz o backup do BD em memória de volta para o disco (recomendado ao final do script) aproveitando o comando interno VACUUM _SQLite_Exec($hBD_Mem, "VACUUM INTO '" & @ScriptDir & "\BancoDeDadosCOPIA.db'") ; fecha tudo _SQLite_Close() _SQLite_Shutdown() Quanto à eficiência de gravação de volta em disco, temos que lembrar que estas funções, tanto a do SQLite como a do backup da SQLite, foram desenvolvidas tendo em mente uqe estes bancos estariam abertos, sendo utilizados por mais de 1 (um) usuário, portanto durante o procedimento de fazer a cópia, é possível que haja alterações por parte de outros usuários, sendo assim, a cópia já nasceria desatualizada. A API do Backup prevê isso e se necessário, recomeça a cópia par refletir estas alterações. Porém naturalmente que dependendo da quantidade de usuários conectados ou das alterações que estão sendo feitas, a cópia pode demorar eternamente! Outro ponto interessante a ser verificado é que o 5o (quinto) parâmetro da função de Backup é o tamanho do bloco que deve ser copiado. E por tamanho do bloco, temos que olhar a estrutura interna do banco de dados para entendermos melhor este parâmetro e o porque da fixação dele em 16. Todo banco de dados, internamente, possui as informações gravadas em blocos como se fossem páginas de um livro. Dentro da página tem as várias informações de vários registros. O procedimento de backup faz cópia de "x" folhas por vez (padrão de 16). Assim caso alguma dessas folhas sejam modificadas, ela recopia somente estas folhas que estão no bloco. Em teoria, quanto menor este bloco melhor, pois estaríamos reduzindo a recópia (se necessário), porém ao reduzirmos o tamanho do bloco, também aumentamos o tempo necessário para copiar tudo. Assim, aumentar o tamanho do bloco faz com que a cópia seja mais rápida, mas mais sujeita a recópias. Dependendo da situação, e eu estou imaginando que em 90% (ou mais) dos casos de SQLIte com AutoIt, os bancos são praticamente exclusivos, não tem niguém além do próprio script mexendo e também não há vários scripts rodando simultameamente na rede. Se for este o seu caso, pode aumentar o nro de blocos para 256 para obter uma melhor performance na cópia do banco ou até mesmo colocar o valor de -1, para que seja usada a velocidade máxima. Mas muito cuidado com estes parâmetros. Eles devem ser cuidadosamente considerados em razão do ambiente em que o banco de dados está sendo executado. _SQLite_Backup($hBD_Mem, $sCopiaBD, Default, Default, 256) ou _SQLite_Backup($hBD_Mem, $sCopiaBD, Default, Default, -1) SQLitebackup.au3
  23. 1 point
    @Belini, Nunca trabalhei com banco de dados por isto preciso de dicas para criar um banco de dados de aproximadamente 2 milhões de linhas Segundo página do desenvolvedor, SQLite manipula arquivos de até 140 terabytes... Então acho que você tem que colocar mais alguns milhões de linhas para começar a esbarrar no limite técnico. Veja: https://www.sqlite.org/whentouse.html @ Very large datasets e depois fazer a leitura dele linha por linha Beleza, é possível! Mas oriento a não fazer um for...next de 1 até o fim da lista... Vai ficar lento demais! Sugiro fazer por blocos, tipo, de 300 em 300 linhas por vez A mesma coisa vale para inserção de dados... Ler um arquivo inteiro, de não sei quantos mbytes ou gbytes e inserir e um for...next, vai ficar muito lento... Vai por blocos, monta uma query só... que insere um bloco de linhas, exemplo: Local $aInsert[1] _ArrayAdd($aInsert, "INSERT INTO matematica(numeros)VALUES(" & Random(0, 9, 1) & ");") _ArrayAdd($aInsert, "INSERT INTO matematica(numeros)VALUES(" & Random(0, 9, 1) & ");") _ArrayAdd($aInsert, "INSERT INTO matematica(numeros)VALUES(" & Random(0, 9, 1) & ");") _ArrayAdd($aInsert, "INSERT INTO matematica(numeros)VALUES(" & Random(0, 9, 1) & ");") _ArrayAdd($aInsert, "INSERT INTO matematica(numeros)VALUES(" & Random(0, 9, 1) & ");") Repete isso 20x... E no final... Local $sql= _ArrayToString($aInsert, "", 1) _Base_Execute($sql) Faz a execução de um concatenado de SQLs! Qual é a quantidade ideal? Não sei... depende do trabalho do seu insert, tem que testar... AutoIt parece que não se dá bem com loops muito grandes... Mas se for por blocos, parece melhora muito. O ideal é sempre inserir texto, utilizando antes _SQLite_FastEncode(). Ele faz o scape correto dos caracteres, assim não dá erro de insert. Local $frase = "Viva a matemática, que eu tanto amo e não lembro mais nada!" Local $sql = "INSERT INTO livro(frases)VALUES(" & _SQLite_FastEncode($frase) & ");" _Base_Execute($sql)
  24. 1 point
    Terminei de adicionar as 3 opções para tocar que tenho e ficou bem simples basta definir 0 para usar a winmm.dll, 1 para Mplayer 2 para Vlc, agora estou tentando adicionar volume ou mute na udf directshow prá poder usar esta opção também, posso não conseguir um player que toque tudo em todos sistemas mas vou dar ao cliente a opção de usar o player que dê certo com os arquivos que ele tem e depois com o tempo vou ver quais formatos rodam melhor em cada player e vou fazer a escolha do player de forma automática de acordo com a extensão, claro que vou colocar opcional ser feita a escolha do player automaticamente ou não também.
  25. 1 point
    @alexandre Muito bom esse exemplo Fiz um contador (criando do meu jeito porém seguindo a lógica do video) e adicionei a opção de reiniciar o contador. Mas quando o contador é reiniciado o tempo começa com 2 segundos a menos #cs ---------------------------------------------------------------------------- AutoIt Version: 3.3.14.5 Author: Rodrigo Chaves Script Function: Timer 11/2019 #ce ---------------------------------------------------------------------------- #NoTrayIcon #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <WinAPISys.au3> #include <Misc.au3> ;Forca a execucao de apenas uma instancia If _Singleton(@ScriptName, 1) = 0 Then Exit ;/Variaveis controle / tempo Dim $sCreditos = 1 Dim $sHoras, $sMinutos, $sSegundos = 0 ;// ;/Paleta de cores Dim $iColor_Text = 0xFFFFFF ;White Dim $iColor_Background = 0x252525 ;Dark ;// ;Controle de exibicao da GUI e controle Dim $iShowGUI = 'Bottom' ;Top / Bottom Dim $sShow, $bContinue = True ;Dimensao da GUI Dim $iW = 200, $iH = 70 ;GUI Dim Const $hWnd_Main = GUICreate("Timer", $iW, $iH, -1, -1, $WS_POPUPWINDOW, $WS_EX_TOPMOST) ;Define a cor da GUI GUISetBkColor($iColor_Background) ;Coleta as dimensoes e posicao da gui $aGetPos = WinGetPos($hWnd_Main) ;Label Timer $sLabel_Timer = GUICtrlCreateLabel("--:--:--", 0, 0, $aGetPos[2] - 1, 70, BitOR($SS_CENTER, $SS_CENTERIMAGE)) GUICtrlSetFont(-1, 34, 400, 0, "Segoe UI") GUICtrlSetColor(-1, $iColor_Text) ;Label mensagem $sLabel_Aguarde = GUICtrlCreateLabel(" Aguarde. . .", 0, 55, $aGetPos[2] - 1, 17, $SS_CENTERIMAGE) GUICtrlSetFont(-1, 8, 400, 0, "Segoe UI") GUICtrlSetColor(-1, $iColor_Text) ;Configura a visualizacao da GUI If $iShowGUI = 'Bottom' Then ;Move a GUI para perto do tray moveToTaskbar($hWnd_Main) ElseIf $iShowGUI = 'Top' Then GUICtrlSetPos($hWnd_Main, 0, 0, $iW, $iH) EndIf ;Aplica efeito de entrada pela direita _WinAPI_AnimateWindow($hWnd_Main, 0x00040002, 350) GUISetState(@SW_SHOW) ;Configura tecla de atalho HotKeySet('{ESC}', '_Quit') ;Registra a funcao _Clock AdlibRegister('_Clock', 1000) Do ;Calculo do tempo _CoreClock() $iQuestion = MsgBox(262144+32+4, 'O tempo acabou', 'Deseja reiniciar o contador?', 60) If $iQuestion = 6 Then $idInput_Time = InputBox('Timer', 'Insira a quantidade de créditos', 1, '', -1, -1, Default, Default, 60, $hWnd_Main) ;Verifica se algo foi informado If $idInput_Time <> '' Then ;Verifica se eh um caracter numerico If StringIsDigit($idInput_Time) Then $sCreditos = $idInput_Time _CoreClock() $bContinue = True Else MsgBox(262144+64, 'Timer', 'Informações inválidas', 10) $bContinue = False EndIf EndIf Else $bContinue = False EndIf Until $bContinue = False ;Aguarda para zerar o relogio Sleep(1000) ;Cancela o registro da funcao _Clock AdlibUnRegister('_Clock') ;Exibe mensagem GUICtrlSetData($sLabel_Aguarde, ' Concluido Pressione Esc para fechar') While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE _Quit() EndSwitch WEnd ;Contador do tempo Func _Clock() $sSegundos -= 1 GUICtrlSetData($sLabel_Timer, $sShow) If GUICtrlRead($sLabel_Aguarde, 1) <> '' Then GUICtrlSetData($sLabel_Aguarde, '') EndFunc ;Calculo do tempo Func _CoreClock() Do $sSegundos += $sCreditos * 60 $sMinutos = Mod($sSegundos / 60, 60) $sHoras = $sSegundos / 3600 $sCreditos = 0 $sShow = StringFormat('%02i:%02i:%02i', $sHoras, $sMinutos, Mod($sSegundos, 60)) Until $sShow = '00:00:00' EndFunc ;Funcao de saida Func _Quit() If WinActive($hWnd_Main) Then _WinAPI_AnimateWindow($hWnd_Main, 0x00050001, 300) Exit EndIf EndFunc ;Exibe GUI perto do tray Func moveToTaskbar($hwndByRef) $___aTaskbar = WinGetPos("[CLASS:Shell_TrayWnd]", "") $___aWin = WinGetPos($hwndByRef) WinMove($hwndByRef, "", @DesktopWidth - $___aWin[2] - 2, @DesktopHeight - $___aWin[3] - $___aTaskbar[3] - 2) EndFunc
  26. 1 point
    Muito bom o comando Enum. A forma como o array $aKeyboard é construida lembra bastante a de criação de dicionario $oDictionary = ObjCreate("Scripting.Dictionary") $oDictionary.Add ("01", "Um" ) $oDictionary.Add ("02", "Dois") $oDictionary.Add ("03", "Três") $oDictionary.Add ("04", "Quatro")
  27. 1 point
    Bom trabalho @Pedro Pinheiro, achei bem legal ter usado IrrLicht e compartilhar no GitHub!
  28. 1 point
    Um frontend totalmente igual ao pandorabox 3. Fiz em 15 dias para brincar um pouco, mas acabei abandonando. O projeto está aberto no github para download e contribuições com ajudas e ideias. Caso alguém queira atualizações do projeto, vou deixar meu link de doações em aberto, dependendo das doações, o frontend ficará 100% igual ao Pandorabox 3 e terá sistema de skins para o gosto da pessoa. https://github.com/pedrowarlock/FrontEnd_listbox https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=pedro_15boy%40hotmail.com&currency_code=BRL&source=url
  29. 1 point
    A udf que uso é a video.au3 mesmo e ela só não é perfeita porque não tem como mostrar os vídeos em tela cheia independente da resolução mas o resto funciona tudo perfeitamente, achei uma UDF que coloca os videos em tela cheia mas ela depende de uma dll feita pelo criador e nos testes deu alguns bug's que impossibitou de usar. #include-once ; #CURRENT# =============================================================================================== ; _Video_Close ; _Video_Dimension ; _Video_FrameRate ; _Video_Length ; _Video_Mute ; _Video_Open ; _Video_Pause ; _Video_Play ; _Video_Resume ; _Video_Seek ; _Video_Status ; _Video_Step ; _Video_Stop ; _Video_TimePos ; _Video_Volume ; _RandomStr ; _MSToHMS ; _mciDeviceExists ; _mciListDevices ; _mciSendString ;========================================================================================================== ; #FUNCTION# ============================================================================================== ; Name...........: _Video_Close ; Description....: Close a video. ; Syntax.........: _Video_Close($sAlias) ; Parameters ....: $sAlias - Alias name returned by _Video_Open. ; Return values .: Success - Return 1 and sets Alias name to "". ; Failure - Return 0 and @error 1~2 ; @error 1 = Invalid Alias ; @error 2 = MCI failed to close video ; Author ........: smashly ; ========================================================================================================= Func _Video_Close(ByRef $sAlias) If $sAlias = "" Or StringRegExp($sAlias, "\W|_", 0) Then Return SetError(1, 0, 0) If _mciSendString("close " & $sAlias) = 0 Then $sAlias = "" Return SetError(0, 0, 1) Else Return SetError(2, 0, 0) EndIf EndFunc ;==>_Video_Close ; #FUNCTION# ============================================================================================== ; Name...........: _Video_Dimension ; Description....: Retrieves the Width and Height of the source video. ; Syntax.........: _Video_Dimension($sFile) ; Parameters ....: $sFile - The full path to video file. ; Return values .: Success - Returns an array. array[0] = Width, array[1] = Height ; Failure - Return 0 and @error 1~3 ; @error 1 = File doesn't exist. ; @error 2 = MCI failed to open the video file. ; @error 3 = MCI failed to get the source video dimensions. ; Author ........: smashly ; ========================================================================================================= Func _Video_Dimension($sFile) Local $iRet, $sVID, $aTmp If Not FileExists($sFile) Then Return SetError(1, 0, 0) $sVID = _RandomStr() $iRet = _mciSendString("open " & FileGetShortName($sFile) & " alias " & $sVID) If $iRet <> 0 Then Return SetError(2, 0, 0) $iRet = _mciSendString("where " & $sVID & " source", 255) If $iRet = "" Then _mciSendString("close " & $sVID) Return SetError(3, 0, 0) EndIf _mciSendString("close " & $sVID) $aTmp = StringSplit($iRet, Chr(32)) $aTmp[1] = $aTmp[$aTmp[0]] $aTmp[0] = $aTmp[$aTmp[0] - 1] ReDim $aTmp[2] Return $aTmp EndFunc ;==>_Video_Dimension ; #FUNCTION# ============================================================================================== ; Name...........: _Video_FrameRate ; Description....: Close a video. ; Syntax.........: _Video_FrameRate($sAlias) ; Parameters ....: $sAlias - Alias name returned by _Video_Open. ; Return values .: Success - Returns the Frames Per Second of the video. ; Failure - Return 0 and @error 1 ; @error 1 = Invalid Alias ; Author ........: smashly ; ========================================================================================================= Func _Video_FrameRate($sAlias) If $sAlias = "" Or StringRegExp($sAlias, "\W|_", 0) Then Return SetError(1, 0, 0) Return _mciSendString("status " & $sAlias & " nominal frame rate", 255) / 1000 EndFunc ;==>_Video_FrameRate ; #FUNCTION# ============================================================================================== ; Name...........: _Video_Length ; Description....: Get the time length of a video in Milliseconds or Hours, Minutes, Seconds (HH:MM:SS) ; Syntax.........: _Video_Length($sAlias[, $iTime = 0]) ; Parameters ....: $sAlias - Alias name returned by _Video_Open ; $iTime - 0 Return time lenth in Hours, Minutes, Seconds (HH:MM:SS) ; - 1 Return time lenth in Milliseconds. ; Return values .: Success - Return time length in Milliseconds or Hours, Minutes, Seconds (HH:MM:SS) ; Failure - Return 0 and @error 1 ; @error 1 = Invalid Alias ; Author ........: smashly ; ========================================================================================================= Func _Video_Length($sAlias, $iTime = 0) Local $iMS If $sAlias = "" Or StringRegExp($sAlias, "\W|_", 0) Then Return SetError(1, 0, 0) _mciSendString("set " & $sAlias & " time format ms") $iMS = _mciSendString("status " & $sAlias & " length", 255) If Not $iTime Then Return _MSToHMS($iMS) If $iTime Then Return $iMS EndFunc ;==>_Video_Length ; #FUNCTION# ============================================================================================== ; Name...........: _Video_Mute ; Description....: Turn off/on the audio in a video. ; Syntax.........: _Video_Mute($sAlias[, $iMute = 0]) ; Parameters ....: $sAlias - Alias name returned by _Video_Open. ; $iAudio - 0 = Audio On, 1 = Audio Off ; Return values .: Success - Return 1 and @error 0 ; Failure - Return 0 and @error 1~2 ; @error 1 = Invalid Alias ; @error 2 = MCI failed to turn the video audio off/on ; Author ........: smashly ; ========================================================================================================= Func _Video_Mute($sAlias, $iMute = 0) Local $iRet, $iAM = "on" If $sAlias = "" Or StringRegExp($sAlias, "\W|_", 0) Then Return SetError(1, 0, 0) If $iMute Then $iAM = "off" $iRet = _mciSendString("set " & $sAlias & " audio all " & $iAM) If $iRet = 0 Then Return SetError(0, 0, 1) Else Return SetError(2, 0, 0) EndIf EndFunc ;==>_Video_Mute ; #FUNCTION# ============================================================================================== ; Name...........: _Video_Open ; Description ...: Opens a Video file ready for use with other _Video_xxxx functions. ; Syntax.........: _Video_Open($sFile, $hWnd, $iX, $iY, $iW, $iH[, $sDevice = ""]) ; Parameters ....: $sFile - The full path to video file. ; $hWnd - Handle to a window or control that the video will be displayed on ; $iX - Left position of the video. ; $iY - Top position of the video. ; $iW - Width of the video. ; $iH - Height of the video. ; $sDevice - MCI Device type to play video with. (See Remarks for more info) ; Return values .: Success - Return an Alias name for use with other _Video_xxxx functions. ; Failure - Return an empty String "" and @error 1~5 ; @error 1 = File doesn't exist ; @error 2 = Window or Control handle not valid. ; @error 3 = Invalid MCI Device type specified. ; @error 4 = MCI failed to open video file ; @error 5 = MCI failed window for video. ; @error 5 = MCI failed to put video at the deignated location. ; Author ........: smashly ; Remarks .......: If your having trouble with avi playback (eg; playing fast, slow, choppy or no audio) ; or a video won't play but it plays fine in any other player ... ; Then set the $sDevice parameter to "MPEGVideo" ; If the $sDevice parameter is left blank then windows will decide which MCI Device type ; to use. ; Most current day avi/wmv/mp4 formats dont play properly or at all when windows selects ; the mci device type to use. ; Windows would default use "AVIVideo" MCI Device type to play avi with mci. ; When you specify "MPEGVideo" for an avi and mci fails it then uses the windows native ; chain of codecs that would be used by any other player not using mci ;) ; Because of this behaviour you can usually play almost any type of video that normally ; fails when using mci just by specifying "MPEGVideo" mci device type. ; For playing video on an autoit gui then be sure to add the $WS_CLIPCHILDREN style ; to your Gui. This will keep the Video dislpayed on your Gui all the time. ; ========================================================================================================= Func _Video_Open($sFile, $hWnd, $iX, $iY, $iH, $iW, $sDevice = "") Local $sVID, $gId, $iRet, $sDT = "" If Not FileExists($sFile) Then Return SetError(1, 0, "") If Not IsHWnd($hWnd) Then Return SetError(2, 0, "") If $sDevice <> "" Then If Not _mciDeviceExists($sDevice) Then Return SetError(3, 0, "") $sDT = " type " & $sDevice EndIf $gId = Dec(StringTrimLeft($hWnd, 2)) $sVID = _RandomStr() $iRet = _mciSendString("open " & FileGetShortName($sFile) & " alias " & $sVID & $sDT) If $iRet <> 0 Then Return SetError(4, 0, "") $iRet = _mciSendString("window " & $sVID & " handle " & $gId) If $iRet <> 0 Then _mciSendString("close " & $sVID) Return SetError(5, 0, "") EndIf $iRet = _mciSendString("put " & $sVID & " destination at " & $iX & " " & $iY & " " & $iH & " " & $iW) If $iRet <> 0 Then _mciSendString("close " & $sVID) Return SetError(6, 0, "") EndIf Return SetError(0, 0, $sVID) EndFunc ;==>_Video_Open ; #FUNCTION# ============================================================================================== ; Name...........: _Video_Pause ; Description....: Pause a Video at the current playing position. ; Syntax.........: _Video_Pause($sAlias) ; Parameters ....: $sAlias - Alias name returned by _Video_Open. ; Return values .: Success - Return 1 and @error 0 ; Failure - Return 0 and @error 1~2 ; @error 1 = Invalid Alias ; @error 2 = Failed to pause video. ; Author ........: smashly ; ========================================================================================================= Func _Video_Pause($sAlias) Local $iRet If $sAlias = "" Or StringRegExp($sAlias, "\W|_", 0) Then Return SetError(1, 0, 0) $iRet = _mciSendString("pause " & $sAlias) If $iRet = 0 Then Return SetError(0, 0, 1) Else Return SetError(2, 0, 0) EndIf EndFunc ;==>_Video_Pause ; #FUNCTION# ============================================================================================== ; Name...........: _Video_Play ; Description....: Plays a Video from the current position. ; Syntax.........: _Video_Play($sAlias[, $iMode = 0]) ; Parameters ....: $sAlias - Alias name returned by _Video_Open. ; $iMode - 0 play video on the window or control as specified in _Video_Open ; - 1 play video in Fullscreen mode. ; Return values .: Success - Return 1 and @error 0 ; Failure - Return 0 and @error 1~2 ; @error 1 = Invalid Alias ; @error 2 = MCI failed to play video. ; Author ........: smashly ; ========================================================================================================= Func _Video_Play($sAlias, $iMode = 0) Local $iRet If $sAlias = "" Or StringRegExp($sAlias, "\W|_", 0) Then Return SetError(1, 0, 0) If _Video_TimePos($sAlias, 1) = _Video_Length($sAlias, 1) Then _Video_Seek($sAlias, "start") If $iMode Then $vRet = _mciSendString("play " & $sAlias & " fullscreen") Else $iRet = _mciSendString("play " & $sAlias) EndIf If $iRet = 0 Then Return SetError(0, 0, 1) Else Return SetError(1, 0, 0) EndIf EndFunc ;==>_Video_Play ; #FUNCTION# ============================================================================================== ; Name...........: _Video_Resume ; Description....: Resume playing a video after pausing. ; Syntax.........: _Video_Resume($sAlias) ; Parameters ....: $sAlias - Alias name returned by _Video_Open. ; Return values .: Success - Return 1 and @error 0 ; Failure - Return 0 and @error 1~2 ; @error 1 = Invalid Alias ; @error 2 = MCI failed to resume video. ; Author ........: smashly ; ========================================================================================================= Func _Video_Resume($sAlias) Local $iRet If $sAlias = "" Or StringRegExp($sAlias, "\W|_", 0) Then Return SetError(1, 0, 0) $iRet = _mciSendString("resume " & $sAlias) If $iRet = 0 Then Return SetError(0, 0, 1) Else Return SetError(2, 0, 0) EndIf EndFunc ;==>_Video_Resume ; #FUNCTION# ============================================================================================== ; Name...........: _Video_Seek ; Description....: Seek a video to the specified time position. ; Syntax.........: _Video_Seek($sAlias, $iTime) ; Parameters ....: $sAlias - Alias name returned by _Video_Open. ; $iTime - Time to Seek. Can be Millisecons or HH:MM:SS or "start" or "end" ; Return values .: Success - Return 1 and @error 0 ; Failure - Return 0 and @error 1~3 ; @error 1 = Invalid Alias ; @error 2 = Invalid time format. ; @error 3 = MCI Seek error ; Author ........: smashly ; ========================================================================================================= Func _Video_Seek($sAlias, $iTime) Local $iMS, $aTime, $iRet If $sAlias = "" Or StringRegExp($sAlias, "\W|_", 0) Then Return SetError(1, 0, 0) If StringInStr($iTime, ":") Then $aTime = StringSplit($iTime, ":") If $aTime[0] <> 3 Then Return SetError(2, 0, 0) $iMS = 1000 * ((3600 * $aTime[1]) + (60 * $aTime[2]) + $aTime[3]) ElseIf StringIsInt($iTime) Or $iTime = "start" Or $iTime = "end" Then $iMS = $iTime Else Return SetError(2, 0, 0) EndIf _mciSendString("set " & $sAlias & " time format ms") $iRet = _mciSendString("seek " & $sAlias & " to " & $iMS) If $iRet = 0 Then Return SetError(0, 0, 1) Else Return SetError(3, 0, 0) EndIf EndFunc ;==>_Video_Seek ; #FUNCTION# ============================================================================================== ; Name...........: _Video_Status ; Description....: Get a status status message from a video device. ; Syntax.........: _Video_Status($sAlias[, $sQuery = "mode"]) ; Parameters ....: $sAlias - Alias name returned by _Video_Open ; $sQuery - What to get the status of: ; "audio" - returns the "on" or "off" ; "mode" - returns "paused", "playing" and "stopped" ; Return values .: Success - Returns a Status message from the video device. ; Failure - Return 0 and @error 1 ; @error 1 = Invalid Alias ; @error 2 = Invalid query (To be implemented) ; Author ........: smashly ; ========================================================================================================= Func _Video_Status($sAlias, $sQuery = "mode") If $sAlias = "" Or StringRegExp($sAlias, "\W|_", 0) Then Return SetError(1, 0, 0) ;; error check for the $sQuery goes here Return _mciSendString("status " & $sAlias & " " & $sQuery, 255) EndFunc ;==>_Video_Status ; #FUNCTION# ============================================================================================== ; Name...........: _Video_Step ; Description....: Step a video forwards or backwards by a number of frames. ; Syntax.........: _Video_Step($sAlias, $iFrames) ; Parameters ....: $sAlias - Alias name returned by _Video_Open ; $iFrames - The number of frames to step, use negative numbers to step backwards. ; Return values .: Success - Returns 1 and @error 0 ; Failure - Return 0 and @error 1~3 ; @error 1 = Invalid Alias ; @error 2 = Invalid frames ; @error 3 = MCI Step error ; Author ........: smashly ; ========================================================================================================= Func _Video_Step($sAlias, $iFrames) Local $iRet If $sAlias = "" Or StringRegExp($sAlias, "\W|_", 0) Then Return SetError(1, 0, 0) If StringRegExp(StringReplace($iFrames, "-", ""), '\D', 0) Then Return SetError(2, 0, 0) $iRet = _mciSendString("step " & $sAlias & " by " & $iFrames) If $iRet = 0 Then Return SetError(0, 0, 1) Else Return SetError(3, 0, 0) EndIf EndFunc ;==>_Video_Step ; #FUNCTION# ============================================================================================== ; Name...........: _Video_Stop ; Description....: Stop a Video playing. (seeks video to start) ; Syntax.........: _Video_Stop($sAlias) ; Parameters ....: $sAlias - Alias name returned by _Video_Open. ; Return values .: Success - Return 1 and @error 0 ; Failure - Return 0 and @error 1~2 ; @error 1 = Invalid Alias ; @error 2 = Failed to stop or seek ; Author ........: smashly ;========================================================================================================== Func _Video_Stop($sAlias) Local $iRet, $iRet2 If $sAlias = "" Or StringRegExp($sAlias, "\W|_", 0) Then Return SetError(1, 0, 0) $iRet = _Video_Seek($sAlias, "start") $iRet2 = _mciSendString("stop " & $sAlias) If $iRet = 0 And $iRet2 = 0 Then Return SetError(0, 0, 1) Else Return SetError(2, 0, 0) EndIf EndFunc ;==>_Video_Stop ; #FUNCTION# ============================================================================================== ; Name...........: _Video_TimePos ; Description....: Get the time poition of a video in Milliseconds or Hours, Minutes, Seconds (HH:MM:SS) ; Syntax.........: _Video_TimePos($sAlias[, $iTime = 0]) ; Parameters ....: $sAlias - Alias name returned by _Video_Open. ; $iTime - 0 Return time lenth in Hours, Minutes, Seconds (HH:MM:SS) ; - 1 Return time lenth in Milliseconds. ; Return values .: Success - Return time position in Milliseconds or Hours, Minutes, Seconds (HH:MM:SS) ; Failure - Return 0 and @error 1 ; @error 1 = Invalid Alias ; Author ........: smashly ; ========================================================================================================= Func _Video_TimePos($sAlias, $iTime = 0) Local $iMS If $sAlias = "" Or StringRegExp($sAlias, "\W|_", 0) Then Return SetError(1, 0, 0) _mciSendString("set " & $sAlias & " time format ms") $iMS = _mciSendString("status " & $sAlias & " position", 255) If Not $iTime Then Return _MSToHMS($iMS) If $iTime Then Return $iMS EndFunc ;==>_Video_TimePos ; #FUNCTION# ============================================================================================== ; Name...........: _Video_Volume ; Description....: Turn the video audio volume up or down. ; Syntax.........: _Video_AudioVolume($sAlias[, $iVolume = 100]) ; Parameters ....: $sAlias - Alias name returned by _Video_Open. ; $iVolume - 0 = Min, 100 = Max ; Return values .: Success - Return 1 and @error 0 ; Failure - Return 0 and @error 1~2 ; @error 1 = Invalid Alias ; @error 2 = Invalid Volume ; @error 3 = MCI failed to set volume ; Author ........: smashly ; ========================================================================================================= Func _Video_Volume($sAlias, $iVolume = 100) Local $iRet, $iVol If $sAlias = "" Or StringRegExp($sAlias, "\W|_", 0) Then Return SetError(1, 0, 0) If StringRegExp($iVolume, '\D', 0) Then Return SetError(2, 0, 0) If $iVolume >= 100 Then $iVol = 1000 ElseIf $iVolume <= 0 Then $iVol = 0 ElseIf $iVolume > 0 And $iVolume < 100 Then $iVol = $iVolume * 10 EndIf $iRet = _mciSendString("setaudio " & $sAlias & " volume to " & $iVol) If $iRet = 0 Then Return SetError(0, 0, 1) Else Return SetError(3, 0, 0) EndIf EndFunc ;==>_Video_Volume ;========================================================================================================== ; Internal use functions beyond this point ;========================================================================================================== ; #FUNCTION# ============================================================================================== ; Name...........: _MSToHMS ; Description....: Converts Milliseconds to Hours, Minutes, Seconds ; Syntax.........: _MSToHMS($iMS) ; Parameters ....: $iMS - Milliseconds to convert ; Return values .: Success - Returns Hours, Minutes, Seconds (HH:MM:SS) ; Author ........: smashly ; ========================================================================================================= Func _MSToHMS($iMS) Local $iHours = 0, $iMins = 0, $iSecs = 0 If Number($iMS) > 0 Then $iMS = Round($iMS / 1000) $iHours = Int($iMS / 3600) $iTicks = Mod($iMS, 3600) $iMins = Int($iMS / 60) $iSecs = Round(Mod($iMS, 60)) Return StringFormat("%02i:%02i:%02i", $iHours, $iMins, $iSecs) EndIf Return StringFormat("%02i:%02i:%02i", $iHours, $iMins, $iSecs) EndFunc ;==>_MSToHMS ; #FUNCTION# ============================================================================================== ; Name...........: _RandomStr ; Description....: Creates a random string ; Syntax.........: _RandomStr([$iLen = 10]) ; Parameters ....: $iLen - Length of string to return ; Return values .: Success - Returns a string of random letters (a~z) ; Author ........: RazerM ; ========================================================================================================= Func _RandomStr($iLen = 10) Local $sTmp = '' For $i = 1 To $iLen $sTmp &= Chr(Random(97, 122, 1)) Next Return $sTmp EndFunc ;==>_RandomStr ; #FUNCTION# ============================================================================================== ; Name...........: _mciDeviceExists ; Description....: Check if a MCI Device type exists ; Syntax.........: _mciDeviceExists($sDevice) ; Parameters ....: $sDevice - Name of MCI Device type to check for ; Return values .: Success - Return 1 if MCI Device type exists and @error 0 ; Failure - Return 0 if MCI Device type does not exist and @error 1~2 ; @error 1 = No matching MCI Device type found. ; @error 2 = Failed to list any MCI Device types ; Author ........: smashly ; ========================================================================================================= Func _mciDeviceExists($sDevice) Local $aDT = _mciListDevices() If @error Then Return SetError(2, 0, 0) For $idx = 1 To $aDT[0] If $sDevice = $aDT[$idx] Then Return SetError(0, 0, 1) Next Return SetError(1, 0, 0) EndFunc ;==>_mciDeviceExists ; #FUNCTION# ============================================================================================== ; Name...........: _mciListDevices ; Description....: List all found MCI Device types in an array ; Syntax.........: _mciListDevices() ; Parameters ....: None ; Return values .: Success - Return 1D array of found MCI Device types and @error 0 ; array[0] Number of MCI Device types found ; array[n] MCI Device type name ; Failure - Return empty 1D array and @error 1 ; Author ........: smashly ; ========================================================================================================= Func _mciListDevices() Local $iMD, $sTmp $iMD = _mciSendString("sysinfo all quantity", 255) If StringIsInt($iMD) Then For $idx = 1 To $iMD $sTmp &= _mciSendString("sysinfo all name " & $idx, 255) & Chr(0) Next Return SetError(0, 0, StringSplit(StringTrimRight($sTmp, 1), Chr(0))) EndIf Return SetError(1, 0, StringSplit($sTmp, Chr(0))) EndFunc ;==>_mciListDevices ; #FUNCTION# ============================================================================================== ; Name...........: _mciSendString ; Description....: ; Syntax.........: _mciSendString($string[, $iLen = 0]) ; Parameters ....: $string ; $iLen ; Return values .: ; Author ........: RazerM ; ========================================================================================================= Func _mciSendString($string, $iLen = 0) Local $iRet $iRet = DllCall("winmm.dll", "int", "mciSendStringA", "str", $string, "str", "", "long", $iLen, "long", 0) If Not @error Then Return $iRet[2] EndFunc ;==>_mciSendString
  30. 1 point
    estou reformulando um script que fecha um programa e abre outro mas quero fazer o seguinte escolher a tecla para fechar um e abrir outro e fechar o script em um arquivo.ini ou seja escolher no .ini as teclas que vou usar no programa,mas fiquei sem ideias alguém pode ajudar? CORRIGINDO CONSEGUI FAZER FUNCIONAR APENAS MUDEI PARA Const $read_comand2 = IniRead("MUSICBOX.ini", "PARAMETRO", "TECLA_TROCA", "") Const $read_comand3 = IniRead("MUSICBOX.ini", "PARAMETRO", "SAIR", "") SÓ LEMBRANDO O BELINI POSTOU ESSE SCRIPT HA UM TEMPO ATRÁS NO ARCADEBR EU SÓ DEI UMA MELHORADA NELE FileChangeDir(@ScriptDir) If Not FileExists("MUSICBOX.ini") Then;cria o ini caso não tenha ini     IniWrite("MUSICBOX.ini", "EXECUTAVEL1", "NOME", "");cria alocação boot e numero     IniWrite("MUSICBOX.ini", "EXECUTAVEL2", "NOME", "");cria alocação boot e numero     IniWrite("MUSICBOX.ini", "PARAMETRO", "PASTA", "");cria alocação boot e numero     IniWrite("MUSICBOX.ini", "PARAMETRO", "TECLA_TROCA", "");cria alocação boot e numero     IniWrite("MUSICBOX.ini", "PARAMETRO", "SAIR", "");cria alocação boot e numero endif CONST $read_comand2 = IniRead("MUSICBOX.ini", "PARAMETRO", "TECLA_TROCA", "") CONST $read_comand3 = IniRead("MUSICBOX.ini", "PARAMETRO", "SAIR", "") global $read_comand4 = IniRead("MUSICBOX.ini", "EXECUTAVEL1", "NOME", "") global $read_comand5 = IniRead("MUSICBOX.ini", "EXECUTAVEL2", "NOME", "") global $read_comand6 = IniRead("MUSICBOX.ini", "PARAMETRO", "PASTA", "") HotKeySet($read_comand2 ,"close_open"); instala a hotkey usando no .ini HotKeySet($read_comand3 ,"fecha_script"); instala a hotkey usando a tecla "F" ShellExecute($read_comand5, "", $read_comand6); mude o nome do programa e o endereço caso necessário ; rotina de loop que mantém o script aberto. While 1 sleep(200); dá um intervalo de 200 milisegundos wend func close_open(); troca o programa quando a tecla "X" for pressionada if ProcessExists($read_comand4) Then; verifica se o advmame esta aberto ProcessClose($read_comand4); fecha 1 e abre o 2 ShellExecute($read_comand5, "", $read_comand6); mude o nome do programa e o endereço caso necessário else ProcessClose($read_comand5); fecha o 2 e abre o 1 ShellExecute($read_comand4, "", $read_comand6); mude o nome do programa e o endereço caso necessário endif endfunc func fecha_script(); fecha o script  HotKeySet($read_comand2 ,"close_open"); remove a hotkey usando no .ini HotKeySet($read_comand3 ,"fecha_script"); remove a hotkey usando no .ini Exit; encerra o script endfunc
  31. 1 point
    Olá, Compartilhando um script de efeitos com direct3D9 usando a biblioteca au3Irrlicht2.au3 #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Res_Description=Background Sample #AutoIt3Wrapper_Res_Fileversion=1.0.0.0 #AutoIt3Wrapper_Res_ProductVersion=1.0.0.0 #AutoIt3Wrapper_Res_LegalCopyright=rcneto #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #cs ---------------------------------------------------------------------------- AutoIt Version: 3.3.14.5 Author: Rodrigo Chaves Script Function: Background Sample 07/2019 #ce ---------------------------------------------------------------------------- #include "au3Irrlicht2.au3" Opt("MustDeclareVars", True) HotKeySet("{ESC}", "_exit") Dim $camera Dim $cameraNode Dim $cloudTexture Dim $cloudNode Dim $aVector3Df[3] SplashTextOn('Background Sample', 'Por favor aguarde - Iniciando audio', 350, 110, -1, -1, 32) SoundPlay(@ScriptDir & '\Media\audio.mp3') Sleep(3000) SplashOff() _irrStart($irr_Edt_Direct3D9, 1024, 768, $irr_Bits_Per_Pixel_32, $irr_Windowed, $irr_Shadows, $irr_Ignore_Events, $irr_Vertical_Sync_On) _irrSetResizableWindow($irr_on) _irrSetWindowCaption("Background Sample / Pressione Esc para fechar") $cloudTexture = _irrGetTexture("media/cloud1.bmp") $cloudNode = _irrAddClouds($cloudTexture, 1, 1000, 3100) _irrSetNodeMaterialFlag($cloudNode, $irr_Emf_Fog_Enable, $irr_On) _irrSetNodePosition($cloudNode, 4000, 100, 4000) _irrAddRotationAnimator($cloudNode, 0.05, 0.08, 0.05) $camera = _irrAddCamera(0, 0, 0, 0, 0, 0) $cameraNode = $camera _irrSetNodePosition($cameraNode, 4000, 2000.7, 20000.9) _irrSetCameraFov($cameraNode, 1.55) _irrSetCameraClipDistance($camera, 12000) _irrSetAmbientLight(0.1, 0.1, 0.1) While _irrRunning() _irrBeginScene(130, 130, 255) $aVector3Df = _irrGetNodePosition($cameraNode) _irrDrawScene() _irrEndScene() WEnd _irrStop() Func _exit() _irrstop() Exit EndFunc https://www.youtube.com/watch?v=lo03F6CpXXc&feature=youtu.be O código fonte, biblioteca e arquivos de mídia estão no link abaixo https://1drv.ms/u/s!AnsPM67Cyv4XjJF_gnMKVuSCQdpdig?e=QM0aa8
  32. 1 point
    Gostaria de saber quais funções podem ser adicionadas a essa biblioteca Como trabalho em uma empresa multinacional e utilizamos muito Autoit aqui, desde 2008 se não me falha a memória, acabo que tendo que criar varias UDFs para atender a demandas específicas. Caso a biblioteca for de uso geral para area comercial, gostaria de implementar algumas funções que utilizo ou ja utilizei em ambito corporativo. Exemplo: Extrair informações, gerenciar objetos do Active Directory em massa Efetuar login na aplicação utilizando credenciais do Active Directory ou local Instalar softwares de forma automatizada, utilizando interface própria ou em modo silent Gerenciar infomações de banco de dados Aplicar correções do Windows Gerenciar informações do Registro e etc.
  33. 1 point
    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...
  34. 1 point
    Olá AleCruz. Esse acontecimento não é de agora. Esta discussão ocorre faz muitos anos e já rendeu muito "pano pra manga". Existe inclusive um tópico "eterno" no fórum americano sobre isso. Pode acessar aqui: Meus arquivos estão realmente infectados? = https://www.autoitscript.com/forum/topic/34658-are-my-autoit-exes-really-infected/ O que acontece é que o AutoIt é uma ferramenta fantástica e muito poderosa. Tão poderosa que vários criadores de vírus utilizaram (e ainda a utilizam) para criar malwares. Porém a maioria dos programadores em AutoIt, utilizam para fins corretos e funcionais. Mas como sempre, uma pequena quantidade de óleo, suja uma grande quantidade de água! Portanto, junte isso com a "preguiça" da indústria de antivírus de reconhecer este problema, gerou uma situação que estamos vivenciando. Para a indústria de antivirus, todo e qualquer executável de AutoIt é automaticamente marcado como malware. Alguns AVs são mais rigorosos, outros nem tanto. Na prática, nosso produtos decorrentes da compilação dos nosso scripts, são basicamente taxados de vírus! E não tem como resolver isto! Eu pessoalmente, trabalho profissionalmente com AutoIt fazem vários anos, inclusive com várias ferramentas e aplicativos no mercado e todo santo dia, é um pepino para explicar que meu programas não são vírus ou não estão infectados! Ainda mais que um dos meus mercados é o setor público, que fica difícil de achar alguém preparado. Outra ferramenta minha, de segurança digital, que previne e reconhece várias tentativas de acesso de vírus e malwares, sofre muito com o reconhecimento dela mesma como se fosse um malware. Fica muito difícil vc vender uma ferramenta de proteção que os próprios AVs identificam como vírus. Parece que quero enganar todo mundo! E dê-lhe explicação... E isto não ocorre apenas com o AutoIt, vários produtores menores de software (como eu), sofrem constantemente com o "falso positivo". Estes dias, li um post no site Sordum, que possui várias ferramentas interessantes, que a reclamação deles tbm existe. Outro exemplo é a RineSoft onde eles fazem o mesmo questionamento = https://www.rizonesoft.com/is-rizonesoft-software-safe/ Tem vários lugares para vc informar as empresas de AV que seu software é seguro, mas a resposta é lenta e na maioria, não resolve nada. Já tive vários chats e trocas de e-mail com empresas como Avast sobre isso, e a prepotência e arrogância deles é incrível. Outra estupidez é a própria M$ (Microsoft) com seu filtro "SmartScreen", desenvolvido para Windows 10, outra ferramenta além do Windows Defender. Para que seu software seja reconhecido como confiável, basta pagar! E assim por diante... Uma sugestão muito apreciada é vc assinar o seu software com um certificado digital confiável, e enviar uma cópia deste certificado para as empresas de AV para que os mesmos reconheçam seu sotware como seguro. Problemas: não garante nada depende do fabricante do AV em considerar sua empresa como idônea E é caro adquirir um certificado deste modelo aqui no Brasil. Lá fora é super-barato, cerca de U$ 90 por 3 anos. Aqui custa milhares de reais por 1 ano. Dependendo da empresa, isto é inviável. Neste último link da Rizone Software tbm tem uma lista de onde enviar seus softwares para análise dos AVs
  35. 1 point
    Olá pessoal. Seguindo com as atualizações (v1.03) e novas funções (StringDifference e Trunc). StringDifference serve para mostrar a diferença entre 2 strings. O normal é usar os operadores = ou <> para saber se as strings são iguais ou não. Com esta, podemos ver também QUAL a diferença. STRINGDIFFERENCE("abc", "abcde") ; return "de" STRINGDIFFERENCE("123456", "246") ; return "135" STRINGDIFFERENCE("Segunda-feira", "Segunda") ; return "-feira" Trunc é uma função normal para trabalhar com números. Não tinha percebido que não existe naturalmente no AutoIt. Existem INT, ROUND, FLOOR e CEILING, todas com funções diferentes da TRUNC. Seguem as diferenças entre as demais citadas. TRUNC(1.238, 2) ; return 1.23 INT(1.238) ; return 1 FLOOR(1.238) ; return 1 CEILING(1.238) ; return 2 ROUND(1.238, 2) ; return 1.24 ROUND(1.238, 1) ; return 1.2 ROUND(1.238, 0) ; return 1 Arquivo principal no 1o post atualizado.
  36. 1 point
    @Luigi. Boa! Minha função anterior era na mesma linha, usando Regex também. Daí achei essa função interna do Windows que traz inclusive os separadores de milhar e de decimal de acordo com a linguagem do Windows. Achei mais interessante. Mas muito bom. Show de bola!
  37. 1 point
    @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
  38. 1 point
    Ok, agora segue algumas funções de números: ; #FUNCTION# ==================================================================================================================== ; Name ..........: FATORIAL ; Description ...: Fatorial de um número ; Syntax ........: FATORIAL ($nNumero) ; Parameters ....: $nNumero - [Number] Nro para calcular o fatorial ; Return values .: Sucesso - [Number] Fatorial do nro ; Falha - [Number] 0 e seta @error ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: FATORIAL(5) ; retorna 120 ; =============================================================================================================================== Func FATORIAL ($nNumero) If $nNumero <= 0 Then Return SetError(1, 0, 0) If $nNumero = 1 Then Return SetError(0, 0, 1) Return SetError(0, 0, $nNumero * FATORIAL($nNumero - 1)) EndFunc ;==>FATORIAL ; #FUNCTION# ==================================================================================================================== ; Name ..........: STRZERO ; Description ...: Completa com zeros à esquerda dos números ; Syntax ........: STRZERO ($nNumero, $nDigitos[, $nDecimais = 0]) ; Parameters ....: $nNumero - [Number] Nro a ser formatado ; $nDigitos - [Number] Quantidade de dígitos ; $nDecimais - [optional,Number] Quantidade de decimais. Default is 0. ; Return values .: Sucesso - [String] Nro formatado ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: STRZERO(123, 5) ; retorna "00123" ; STRZERO(123, 7, 2) ; retorna "00123.00" ; Remarks .......: Quando informa as decimais o tamanho aumenta em 1 caracter por causa do ponto decimal ; =============================================================================================================================== Func STRZERO ($nNumero, $nDigitos, $nDecimais = 0) If $nDecimais = Default Then $nDecimais = 0 If $nDecimais > 0 Then $nDigitos += 1 Return SetError(0, 0, StringFormat("%0" & $nDigitos & "." & $nDecimais & "f", $nNumero)) EndFunc ;==>STRZERO ; #FUNCTION# ==================================================================================================================== ; Name ..........: NUMBERFORMAT ; Description ...: Formata um nro com separador de milhares e decimais ; Syntax ........: NUMBERFORMAT($nNumero[, $nDecimais = 2[, $bContabil = False[, $sSep_Decimal = $GsSep_Decimal[, $sSep_Milhar = $GsSep_Milhar]]]]) ; Parameters ....: $nNumero - [Number] Nro a ser formatado ; $nDecimais - [optional, Number] Quantidade de decimais. Default is 2. ; $nTamanho - [optional, Number] Tamanho da formatação. Default is 0 = tamanho que der ; $bContabil - [optional, Boolean] Se o valor NEGATIVO deve aparecer entre parentesis (padrão contábil) ; $sSep_Decimal - [optional, String] Separador de decimais. Default is "," para Brasil ; $sSep_Milhar - [optional, String] Separador de milhar. Default is "." para Brasil ; Return values .: Sucesso - [String] Nro formatado ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: NUMBERFORMAT(12345, 0) ; retorna "12.345" ; NUMBERFORMAT(12345, 2) ; retorna "12.345,00" ; NUMBERFORMAT(-12345, 0) ; retorna "-12.345" ; NUMBERFORMAT(-12345, 2) ; retorna "-12.345,00" ; NUMBERFORMAT(12345, 0, 15) ; retorna " 12.345" ; NUMBERFORMAT(12345, 2, 15) ; retorna " 12.345,00" ; NUMBERFORMAT(-12345, 0, 15, True) ; retorna " (12.345)" ; NUMBERFORMAT(-12345, 2, 15, True) ; retorna " (12.345,00)" ; Remarks .......: Se for informado um tamanho E não couber o nro, retorna o nro independente do tamanho ; NUMBERFORMAT(12345, 2, 5) ; retorna "12.345,00" ; =============================================================================================================================== Func NUMBERFORMAT($nNumero, $nDecimais = 2, $nTamanho = 0, $bContabil = False, $sSep_Decimal = $GsSep_Decimal, $sSep_Milhar = $GsSep_Milhar) If $nDecimais = Default Then $nDecimais = 2 If $bContabil = Default Then $bContabil = False If $sSep_Decimal = Default Then $sSep_Decimal = $GsSep_Decimal If $sSep_Milhar = Default Then $sSep_Milhar = $GsSep_Milhar Local $sNumero = _WinAPI_GetNumberFormat($GnLCID, $nNumero, _WinAPI_CreateNumberFormatInfo($nDecimais, 0, 3, $sSep_Decimal, $sSep_Milhar, ($bContabil) ? 0 : 1)) If $nTamanho > 0 and $nTamanho > StringLen($sNumero) Then $sNumero = PADL($sNumero, $nTamanho) Return SetError(0, 0, $sNumero) EndFunc ;==>NUMBERFORMAT ; #FUNCTION# ==================================================================================================================== ; Name ..........: MONEYFORMAT ; Description ...: Formata um nro com separador de milhares e decimais e inclue o símbolo da moeda no começo, R$ para Brasil ; Syntax ........: MONEYFORMAT($nNumero[, $nDecimais = 2[, $bContabil = False[, $sSep_Decimal = $GsSep_Decimal[, $sSep_Milhar = $GsSep_Milhar]]]]) ; Parameters ....: $nNumero - [Number] Nro a ser formatado ; $nDecimais - [optional, Number] Quantidade de decimais. Default is 2. ; $nTamanho - [optional, Number] Tamanho da formatação. Default is 0 = tamanho que der ; $bContabil - [optional, Boolean] Se o valor NEGATIVO deve aparecer entre parentesis (padrão contábil) ; $sSep_Decimal - [optional, String] Separador de decimais. Default is "," para Brasil ; $sSep_Milhar - [optional, String] Separador de milhar. Default is "." para Brasil ; Return values .: Sucesso - [String] Nro formatado ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: MONEYFORMAT(12345, 0) ; retorna "R$ 12.345" ; MONEYFORMAT(12345, 2) ; retorna "R$ 12.345,00" ; MONEYFORMAT(-12345, 0) ; retorna "R$ -12.345" ; MONEYFORMAT(-12345, 2) ; retorna "R$ -12.345,00" ; MONEYFORMAT(12345, 0, 15) ; retorna "R$ 12.345" ; MONEYFORMAT(12345, 2, 15) ; retorna "R$ 12.345,00" ; MONEYFORMAT(-12345, 0, 15, True) ; retorna "R$ (12.345)" ; MONEYFORMAT(-12345, 2, 15, True) ; retorna "R$ (12.345,00)" ; Remarks .......: Se for informado um tamanho E não couber o nro mais o símbolo da moeda, retorna a moeda com o nro independente do tamanho ; MONEYFORMAT(12345, 2, 5) ; retorna "R$ 12.345,00" ; =============================================================================================================================== Func MONEYFORMAT($nNumero, $nDecimais = 2, $nTamanho = 0, $bContabil = False, $sSep_Decimal = $GsSep_Decimal, $sSep_Milhar = $GsSep_Milhar) Local $sNumero = NUMBERFORMAT($nNumero, $nDecimais, $nTamanho, $bContabil, $sSep_Decimal, $sSep_Milhar) If $nTamanho = 0 Then Return SetError(0, 0, $GsMoeda & " " & $sNumero) If not StringRegExp($sNumero, "^ {" & StringLen($GsMoeda) + 1 & "}") Then Return SetError(0, 1, $GsMoeda & " " & $sNumero) Return SetError(0, 0, StringRegExpReplace($sNumero, "^ {" & StringLen($GsMoeda) + 1 & "}(.+)$", $GsMoeda & " $1")) EndFunc ;==>MONEYFORMAT
  39. 1 point
    @Luigi. Com certeza que não sou "purista", nem tem como ser atualmente... :lol: Vou abrir um repositório no GitHub e depois deixo o link aqui. Obrigado pela sugestão. @mutleey Qualquer ajuda é bem-vinda, qualquer dúvida, comentário ou crítica construtiva ajuda no processo. Só que precisamos que mais pessoas façam parte... @todos Sendo assim, estou trabalhando em mais algumas funções de números e preciso que alguém se comprometa a desenvolver uma rotina de número por extenso. Alguém se habilita? Não existe errado aqui galera... Só ideias e melhorias...
  40. 1 point
    eu pretendo ajudar com o que puder (dentro do meu minimo conhecimento) mais achei a idéia excelente!!!
  41. 1 point
    @Manimal, sobre o uso do github, acredito que: * é uma nova forma de compartilhar código (não sejamos "puristas" em achar que somente um fórum, no caso o nosso é a única forma de compartilhar código) * uma hora talvez esse forum acabe, e com ele todo o conhecimento, e talvez o github esteja lá (até a Microsoft esta lá) * sua ideia é ótima, e merece visibilidade universal, acho que um forum limita um pouco essa visibilidade, afinal de contas, quem quiser fazer o download e não dar feedback algum, vai fazer isso no forum, no github, em qualquer lugar... quem quiser acrescentar, vai fazer o que for preciso e irá somar *quanto usar o github ser mais complicado, sim, parece, até eu tenho um pouco de dificuldade em entender o conceito de brunchs, mas as grandes ideias nas grandes empresas utilizam esta receita, temos que estudar e assimilar * eu não sou fã de código compartilhado em mediafire ou aquelas paginas que fazem voce esperar 1 minuto e ficam te mostrando propaganda enquanto vc espera, da uma sensacao ruim Mas, é apenas a minha forma de ver, independente do formato que vocé escolher, eu vou ajudar no que for possivel.
  42. 1 point
    Olá Luigi. Com certeza que usar o Github facilitaria as coisas, mas acho que sairia do escopo do fórum não? Nem todos aqui tem acesso ou sabem (ou saberiam) usar o GitHub, só por isso...
  43. 1 point
    Capítulo 01 - O que é uma Janela? Capítulo 02 - Criando sua 1ª Janela. Capítulo 03 - Entendendo as Classes de Janela. Continua em breve... Equipe AutoIt Brasil
×