Dúvida para Implementar Ideia

Na testagem do programa, preste atenção no seguinte:

  • Se o programa fechar sozinho sem mostrar nada, provavelmente o que ocorreu é que ele lançou uma Exception que não foi tratada. Se isso acontecer após pressionar Enter, então a Exception deve ter ocorrido dentro do método ProcessadorDeEventosNativos#nativeKeyPressed(NativeKeyEvent e), aí você pode colocar um try/catch lá dentro que captura a Exception e exibe na Tela.
  • Se você testar o programa na IDE ela já deve mostrar qualquer Exception, mas se testar com o JAR exportado, talvez só apareça essas Exceptions não capturadas se rodar o programa pelo console.
  • Fique atenta ao que a Janela do programa exibe:
    1) Ao iniciar deve ser tudo cinza;
    2) Ao teclar Enter deve capturar e mostrar uma parte da Tela, que é a areaDaSelecao configurada, e que deve conter os números que podem ser selecionados pelo Ctrl+F;
    3) Se dentro dessa área capturada houver algum daqueles pixels laranja que são colocados pela Seleção do Ctrl+F, exatamente daquela cor, então a Janelinha deve mostrar também a área em que ela acredita que está a Checkbox.

Portanto, se “Área-da-Checkbox” não aparecer na Janelinha, significa que o programa não encontrou nenhum pixel laranja (exatamente daquela cor: R=225, G=150, B=50) dentro da “Área-da-Seleção”.

Se a “Área-da-Checkbox” aparecer na Janelinha mas não mostrar a checkbox a ser clicada por inteiro, ou mostrar partes de outras checkbox junto, você precisará mexer nas configurações:

  • margemInferiorAdicionada
  • margemSuperiorAdicionada
  • bordaEsquerdaDaAreaDeCheckbox
  • bordaDireitaDaAreaDeCheckbox

Se a checkbox a ser clicada aparecer por inteiro mas o programa não clicar nela, as causas podem ser:

  • O robô não conseguiu mover o cursor e clicar, mas eu acho que isso lançaria uma Exception e fecharia o programa.
  • Causa mais provável: a partedecheckbox.png não foi encontrada (não deu “match”) dentro da Área-de-Checkbox, se esse é o caso o console deve mostrar "boudsDaCheckbox: null" devido a isso:

Aí vai ser preciso gerar uma nova imagem partedecheckbox.png, talvez com um recorte menor para aumentar as chances de “match”.

Se der problema, me envia um recorte da tela com a Janelinha do programa.

1 curtida

Olá, Douglas.

Tudo bem, eu não consegui ainda permissão para testar na empresa :frowning:
Estou esperando que alguém la me ajude, mas é no tempo deles, vou tentar executar aqui conforme vem me explicando.
Uma duvida e talvez muito boba, eu consigo tornar o programa um executável ou algo portátil, acho que dessa forma eles me dariam mais atenção, acredito que não vão avaliar os códigos. Assim acredito que me deixariam executar, liberaram o Mouse Recorder Pro la, acredito que a sua implementação é meio que com a mesma função.
De qualquer forma assim que avançar aqui te aviso como rodou tudo, muito obrigada por toda ajuda. :blush:

Sim, dá pra fazer qualquer um dos dois. Eu acho que o melhor é ter o JAR exportado, acho que é o “mais portátil” possível, pois é simplesmente:

  • um arquivo .jar;
  • uma pasta “irmã” do Jar (fica dentro do mesmo diretório do Jar, um do lado do outro) chamada “images”;
  • e dentro dessa pasta “images” temos a “partedecheckbox.png”

Pra rodar, é só dar dois clicks no Jar. Também dá pra fazer um atalho dele, por praticidade.

Tem como gerar instalador também.

1 curtida

Você pode pesquisar por “exportar JAR” no NetBeans, no Eclipse é:

Clicar com botão direito no Projeto -> Export… -> Runnable Jar File -> (escolher a classe Main no assistente e a pasta de destino, dando um nome pro Jar) -> Finish.

Eu acho que o JAR roda em qualquer Sistema Operaciona com uma JVM que o aceite (aceite os recursos utilizados por ele e a versão do Java dele), deve ser aí que entra o “escreva uma vez e rode em qualquer lugar”.

Vou estar esperando pra saber o que aconteceu aí :slight_smile:

1 curtida

Ótimo então, vou tentar essa opção.
Obrigada mais vez. :smiley:

“images” é uma pasta dentro da pasta “src”, só isso. Dentro da pasta “images” tem a imagem partedecheckbox.png.

Não vejo porque o projeto teria uma estrutura diferente no NetBeans, no máximo, o NetBeans colocaria o import do JNativeHook em um lugar diferente.

Se o programa não encontrar a imagem na pasta e com o nome que está no código, lança uma Exception. Se as classes forem colocadas em packages errados, nem compila.

Você precisa prestar atenção nisso: As Configurações que falei, incluíndo a imagem partedecheckbox.png precisam ser alteradas/feitas sob-medida para o computador que vai rodar o programa (resolução da tela, sistema operacional, navegador). Tirando um PrinScreen da Tela desse computador com o sistema-web aberto do jeito que você me mandou aquelas imagens já deve ser o suficiente para você conseguir configurar para esse Computador.

Você tem que saber em qual computador irá testar o programa lá na empresa, e preparar as Configurações para que funcionem nesse computador.

Acho que um próximo passo nesse programa, seria colocar as configurações em um arquivo .txt que o programa iria ler e carregar; aí seria só editar esse arquivo .txt para alterar as configurações, sem ter que editar o código fonte e sem ter que re-exportar o Jar.

Posso te mandar a imagem partedecheckbox.png recortada de acordo com os printscreens que você me mandou, entretanto, é importante que você aprenda a criar essa imagem por si só, pra refazer sempre que necessário:

Para criar essa imagem, vá no Computador que rodará o programa, e faça o seguinte:

  1. Abra a Tela do Sistema-Web (como nas imagens que você me mandou);
  2. Tecle “PrintScreen”;
  3. Abra o Paint, dê Ctrl+V, a imagem deve aparecer no Paint;
  4. Dê Zoom no Paint sobre uma das Checkbox da imagem;
  5. Use a Ferramenta de Seleção Retangular do Paint image e selecione o interior da Checkbox, ou uma parte desse interior (anteriormente eu te enviei uma imagem "recortar partedecheckbox.png" que explica sobre o recorte do interior da checkbox);
  6. Após criar a Seleção Retangular, clique em Cortar image;
  7. Vá em “Salvar Como…” -> “Imagem PNG” -> salve com o nome partedecheckbox.png (tudo em letras minúsculas), dentro da pasta “images” do programa.

Se não ficou claro, veja aqui:


Vou te mandar no e-mail o projeto como tenho aqui.

:slight_smile:

1 curtida

Seu serviço de e-mail rejeitou meu e-mail (aparentemente por causa dos anexos zip):

JNativeHook-2.0.3.zip (611,9 KB)
ProjClicadorDeCheckbox.zip (20,7 KB)
ClicadorDeCheckbox.zip (196,0 KB)

Vi aqui que o GUJ permite anexar arquivos, são esses aí em cima.

Tem o programa exportado em JAR, eu percebi depois de exportar que é necessário que a pasta “images” fique dentro da pasta “src” como está no anexo, devido ao caminho relativo que eu coloquei no código: “src/images/partedecheckbox.png”.

Também estou enviando o Projeto do Eclipse, veja que precisa do JNativeHook na minha versão (mais antiga) para rodá-lo, colocando-o na pasta:

C:/Java/JNativeHook-2.0.3/JNativeHook/jar/jnativehook-2.0.3.jar (caminho escrito no arquivo .classpath do projeto).

Se você quiser a versão mais nova do JNativeHook, precisará baixá-la e importá-la pro projeto, e então usá-la.

Veja se consegue fazê-lo rodar aí :slight_smile:

1 curtida

Muito obrigada Douglas, e me desculpe por todo trabalho, preciso estudar bem mais sobre o assunto, pra mim ainda é tudo novo, e venho tentando aprender um pouquinho pela internet dentro do tempo que tenho um espacinho, mas vou procurar fazer um curso para tornar as coisas mais claras pra mim, tenho muito a aprender ainda. :open_mouth:
Obrigada de verdade pela paciência e ajuda quanto a tudo.

Oxe mais que estranho o e-mail ter rejeitado.
De qualquer forma, download realizado aqui, vou levar para empresa e verificar se consigo testar, depois vou ajustando conforme comentou, mas acredito que vai rodar lindamente. :smiley:
Muito mas muito obrigada mesmo.

De nada, vou ficar aguardando pra saber se deu certo :slight_smile:

Douglas, bom dia.

Acabei de realizar o teste, esta funcionando lindamente como disse rss, vou continuar testando durante o meu dia a dia, mas acredito que não vai ocorrer problemas. Fiz o recorte e ele identifica com sucesso, muitíssimo obrigada, e parabéns por esse projeto, você é demais. :smiley:
Estou eufórica com isso, é muito demais esse projeto, você não faz ideia do quanto me ajudou e otimizou minha vida aqui, no momento eu não consigo te pagar por isso, mas gostaria de mais a frente te dar uma $ por isso, se não tiver problemas tenta me encaminhar sua conta nesse e-mail que posso te transferir, veja se não vai voltar, pode demorar um pouquinho porque ainda não to podendo, e considera uma lembrança pela minha gratidão, mas conta com isso.
Que Deus continue te abençoando, obrigada.

Douglas,

Uma duvida, e não me mate por isso, quando o clicador realiza a função de encontrar o checkbox especifico o que esta rodando muito bem,ele habilita pra mim um botão “Imprimir Capa” , onde eu preciso clicar com mouse, e ira gerar um download, sabe me dizer o que consigo fazer para que no momento que o checkbox encontre o numero e eu clique enter alem de selecionar, ele também já pressione o botão “Imprimir Capa”, a logica é a mesma utilizada para os números, porem somente com a função “Imprimir Capa” percebi um pouco tarde esse detalhe, ele não mantem uma altura padrão . Muda muita coisa pra incluir mais essa função no clicador, ele poderia ser reconhecido pelo Ctrl-F também, mas dai não sei qual a maneira mais simples de executar, tem alguma ideia?

Obrigadaaaaa.

Fico muito feliz que deu certo e que Deus te abençou através da minha vida, essa alegria já é meu pagamento :smiley: Que Deus continue te abençoando!

Eu acho que, o código que o programa já tem pode ser bem reutilizado para implementar essa nova funcionalidade; principalmente através da classe BuscadorDeImagemDentroDeImagem.

É só uma questão de criar uma nova Área Retangular para buscar pelo botão, ter uma imagem do botão na Pasta “images”, e usar a classe BuscadorDeImagemDentroDeImagem para buscar pelo Botão dentro desta nova Área Retangular.

Pra clicar no Botão, o programa precisará de um gatilho, que pode ser uma outra Tecla do Teclado (talvez a tecla “Pause Break” ou “Scroll Lock” que parecem ser inúteis rsrs), ou, ele pode ser programado para clicar no botão após clicar na checkbox.

O que acontece é que o programa não tem uma Arquitetura bem pensada para o crescimento dele, porque pra fazer isso é preciso ter uma visão clara de como ele irá crescer. Começar adicionar funcionalidades nele sem refatorá-lo provavelmente vai transformá-lo em uma bagunça, dificultando mexer no código dele cada vez mais.

Outro ponto importante que você precisa levar em consideração é que um Clicador como esse está longe de ser a forma ideal para esse tipo de problema. Pelo que pesquisei, seria com uma Extensão no Navegador, que permite fazer mais que o Clicador, é mais fácil de fazer, tem menos chance de errar, pode dispensar configurações, e foram pensadas justamente pra isso (pelo que me lembro, se entendi bem, os criadores do sistema de extensões do chrome dizem que uma ótima finalidade em criar extensões é adicionar funcionalidades em páginas web por si só, sem depender dos criadores da página para adicionar funcionalidades, como é o seu caso).
Parece-me que teria sido muito mais rápido e fácil, e o resultado seria melhor, se essa solução tivesse sido feita (ou venha a ser feita) com uma extensão para o navegador.

Eu não fiz com uma extensão porque não sei nem o básico de Javascript, mas se você pretende seguir automatizando seu fluxo de trabalho nesse sistema web, o melhor que tem a fazer é aprender Javascript e HTML, e talvez um pouquinho de CSS; com esse conhecimento você já vai conseguir fazer uma Extensão e permitir que ela cresça.

Então agora acho que você precisa refletir sobre isso:

  • O que você espera desse programa para o futuro? Deseja continuar aumentando as funcionalidades de automação dele? Se sim, acho melhor você deixar esse programa como ele está e partir para a criação de uma Extensão de Navegador, vai ser bem melhor.
  • Se essa é a última funcionalidade a ser adicionada ao programa, se você está certa que não precisará modificá-lo depois para adicionar novas funcionalidades, então é viável mexer no código dele para adicionar essa funcionalidade apenas; ela seria então adicionada “rapidamente” (talvez alguns dias?) meio que na gambiarra, porque adicioná-la direito exigiria uma refatoração lenta na arquitetura (muitos dias, e muita análise para saber “pra onde” o programa vai crescer) que eu acho que não vale a pena fazer nesse programa porque ele não é uma boa solução pra esse tipo de problema: ele é a ferramenta errada, a Extensão seria a ferramenta certa.

Se bem que, também há outras opções que não havia pensado, como consumir uma API REST do sistema (se ele tiver), ou utilizar um Navegador sem GUI que é controlado pelo código. Essas opções automatizariam o processo fazendo o trabalho sem que você tenha que abrir o Navegador. Talvez o sistema também ofereça outro tipo de API que você poderia criar um programa para consumir.

Para automatizar o máximo, você teria que analisar todo seu fluxo de trabalho e separar o que um programa pode fazer do que só você pode fazer, assim, seria possível criar um programa onde você faz só o necessário e o programa faz o resto. Por exemplo, você usa Ctrl+F para digitar esses Números, mas da onde vem esses Números? Não seria possível fazer um programa que pega todos esses números automaticamente para que você não tenha que inserí-los manualmente? E depois que você clica em “Imprimir Capa” e os downloads são feitos, o que deve ser feito com esses Dowloads? Mandar para Imprimir? Enviar por e-mail? Você precisa analisar seu fluxo de trabalho e criar sua estratégia de automação a longo prazo.

Automatizar um fluxo de trabalho ao máximo não é algo trivial, precisa de análise e planejamento.

1 curtida

Amém Douglas, que abençoe a nos todos, muito obrigada.
No momento o clicador vai atender, conseguindo incluir essa funcionalidade de clicar no Imprimir dai já funciona exatamente como preciso, quando ele gera o download, clico em imprimir, depois Ctrl+P e o envio gera uma capa, dai é processo manual de novo, infelizmente a função ainda depende muito do processo manual, os números são extraídos de documentos físicos, então eu vou precisar digitar caso a caso, ou no minimo selecionar e fazer um check antes, mas consigo manusear o processo usando um Excel a base de Ctrl+C e Ctrl+V e exclusão, usando o Mouse Pro que havia comentado com você, ele vai repetir meu comando, ele só não atende em caso como esses no qual implementou pra mim, mas se fizer um comando no qual ele clica em um mesmo ponto não tem erro. Acredito que talvez tenha muita coisa a melhorar e que é possível sim obter essa base, mas la tudo entra como melhoria e ninguém da muita atenção sabe até porque gera custos, então estou tentando melhorar os pontinhos que tenho visibilidade e acesso. Mas acho super interessante a ideia da Extensão no Navegador, eu vou pesquisar sobre, não estou tendo muito tempo para me dedicar, mas vou estudando aos poucos, e entendendo melhor vou desenvolvendo e trocando ideias com vocês.

Vou ver se consigo implementar então.

Em que momento o programa deveria clicar no botão “Imprimir Capa”? Sempre após clicar numa checkbox? Após ter clicado em várias checkbox? Ou ao teclar uma outra Tecla específica (que não seja Enter nem nenhuma outra usada pelo Navegador/Sistema-Operacional)?

Acho que ter uma outra tecla te daria mais controle sobre o programa.

E depois de clicar em “Imprimir Capa”? O TextField do Navegador aberto pelo Ctrl+F perde o foco e não é possível digitar nele até clicar nele de novo; você gostaria que o programa então clicasse nele? Gostaria também que o programa fizesse Ctrl+A para selecionar tudo no campo deixando-o pronto para digitar um novo valor apagando o antigo?

Veja certinho como deve ser todo o fluxo de trabalho do programa para não ficar nada errado ou faltando, daí me diga; vou estar aguardando, e quando tiver um tempo implemento. :slight_smile:

1 curtida

DOUGLAS: Em que momento o programa deveria clicar no botão “Imprimir Capa”? Sempre após clicar numa checkbox? Após ter clicado em várias checkbox? Ou ao teclar uma outra Tecla específica (que não seja Enter nem nenhuma outra usada pelo Navegador/Sistema-Operacional)?

R: Deve clicar no “Imprimir Capa” sempre após clicar na Checkbox.

Ele nunca vai selecionar varias checkbox de uma só vez, sera uma para cada impressão gerada.

Como estou usando o Mouse Record Pro ele não está selecionando a Checkbox quando clico Enter, ate tentei usar o teclado virtual mas não sei porque não esta selecionando, ele só funciona quando eu gravo o primeiro comando, quando aperto play para executar como um robo ele nao entende o Enter e não seleciona a checkbox.

O clicador funciona de forma manual corretamente, apenas com o Mouse Record Pro, que ele esta dando erro.

Pensei nesse caso em apenas habilitar a área da Checkbox para que eu pudesse clicar de forma manual mesmo, ao invés de pressionar o “Enter” gostaria de clicar com o mouse na checkbox, isso é possível?

DOUGLAS: E depois de clicar em “Imprimir Capa”? O TextField do Navegador aberto pelo Ctrl+F perde o foco e não é possível digitar nele até clicar nele de novo; você gostaria que o programa então clicasse nele?

Depois de imprimir a capa o que seria legal é que fosse possivel limpar a Checkbox selecionada, assim conseguiria selecionar outra Checkbox, mas isso é só um detalhe viu, da forma que esta, to conseguindo utilizar.

DOUGLAS: Gostaria também que o programa fizesse Ctrl+A para selecionar tudo no campo deixando-o pronto para digitar um novo valor apagando o antigo?

Se esse procedimento for capaz de limpar a Checkbox isso ajuda bastante, mas caso for dar trabalho demais não precisa mexer.

Pontos que já resolveria :

Acionar o botão “Imprimir Capa” , se for por comando do Mouse acredito que vai rodar melhor devido ao uso da ferramenta Mouse Record Pro.

Alterar o gatilho da Checkbox para clique do Mouse.

Se possível : opção para limpar o Chekbox após todas ações.

Fluxo : Mouse Record Pro + Clicador

1 - Pagina Web e Excel com n° xxxx ou xxxx / xxxx abertos.
2 - Ctrl+F pagina web
3 - Ctrl+C / Ctrl+V - Campo Ctrl+F
4 - Executar Clicador
5 - Checkbox Selecionado
6 - Imprimir Capa
7 - Download Realizado
8 - Ctrl+P
9 - Impressão Realizada.
10 - Processo Manual
Posterior o Mouse Pro ira repetir tudo isso para o próximo número.

Esse problema que você relatou provavelmente indica que o JNativeHook não consegue ouvir os Eventos de mouse e teclado lançados pelo Mouse Record Pro.

Vou te enviar um programinha que fiz aqui para você testar isso:
OuveTudo.jar (195,4 KB)

Coloca esse programinha para rodar e depois coloca o Mouse Record Pro para teclar Enter, teclar outras Teclas (como A, B e C), mover o cursor, e dar clicks.

Esse programinha tá usando o JNativeHook na mesma versão, para ouvir “tudo”, vamos ver se ele consegue ouvir os eventos do Mouse Record Pro.

Eu não sabia que você estava usando algo como o Mouse Record Pro para ativar o Clicador (falta de levantar bem os requisitos e de uma boa análise dos casos de uso né? rs), mas agora que sei, tive uma ideia que pode dispensar o JNativeHook do Clicador: O Clicador pode ter apenas um botão numa Janelinha que ficaria sempre visível (alwaysOnTop), aí o Mouse Record Pro simplesmente clica nesse botão para ativar o Clicador!

O que você acha? Testa essa nova versão:

ClicadorDeCheckbox.zip (196,5 KB)

1 curtida

Douglas, bom dia.

É exatamente isso, a versão nova super atende, fiz o teste e funciona muito bem, para acionar o botão “Imprimir Capa” é possível fazer da mesma forma? Eu só não sei se vai dar mais trabalho porque o pixel dele tem vários na mesma cor, não é como o selecionador do Ctrl+F na cor laranja que fixa no exato.
Acho que cheguei a comentar sobre o Mouse Pro sim, mas não detalhei como agora, me desculpe, e mais uma vez agradeço pelo seu tempo dedicado, muito obrigada mesmo, não conseguiria fazer tão rápido e sozinha isso tudo, é muita informação rss, quanto mais vejo as coisas funcionando, mais vontade da de aprender tudo logo , você é muitoooo bom. :scream:
O programa “OuveTudo” a empresa bloqueia a instalação, mas a nova versão esta incrivelmente funcionando. :smiley: