Ir ao conteúdo

C Como por uma macro em segundo plano?


Ir à solução Resolvido por arfneto,

Posts recomendados

Postado

boa tarde criei um macro em loop infinito e gostaria que ele continuasse a rodar em segundo plano mas ele sempre para e só volta se eu digitar manualmente dentro do programa, pela imagem da pra ter uma ideia do que eu quero fazer, gostaria que o Z estivesse sendo digitado sem parar no espaço do bloco de notas. Alguem me ajuda?

 

 

printmacro.png

Postado

@bilbol 

36 minutos atrás, bilbol disse:

boa tarde criei um macro em loop infinito e gostaria que ele continuasse a rodar em segundo plano mas ele sempre para e só volta se eu digitar manualmente dentro do programa

🤔

Poste o código que fez, use o botão Code.

Postado

@Lucca Rodrigues não sei onde esta esse botao code

#include<stdio.h>
#include <windows.h>
#include <conio.h>


autobot()           {

       /* Display message until key is pressed. */
while( _kbhit!=(0) ) {
          _cputs( "Hit me!! " );
    // This structure will be used to create the keyboard
    // input event.

    INPUT ip;

    // Pause for 5 seconds.

Sleep(1000);
    // Set up a generic keyboard event.
    ip.type = 1;

    ip.ki.wScan = 0; // hardware scan code for key
    ip.ki.time = 0;
    ip.ki.dwExtraInfo = 0;
if(ip.type == 1){
    // Press the "A" key
    ip.ki.wVk = 0x5A; // código da tecla em hexadecimal
    ip.ki.dwFlags = 0; // valor 0 pra indicar que a tecla ta sendo pressionada
    SendInput(1, &ip, sizeof(INPUT)); // envia a entrada

    // Release the "A" key
    ip.ki.dwFlags = KEYEVENTF_KEYUP; // KEYEVENTF_KEYUP pra tecla sendo solta
    SendInput(1, &ip, sizeof(INPUT)); // envia a entrada

   // Use _getch to throw key away. */


printf( "\nKey struck was '%c'\n", _getch());

}
}
}
int main (){
    autobot();
}

 

Postado

@bilbol Parece que você pegou várias partes de códigos por aí e juntou 🤔

 

Então você quer que isso aqui ocorra:

1 hora atrás, bilbol disse:

gostaria que ele continuasse a rodar em segundo plano mas ele sempre para e só volta se eu digitar manualmente

Sendo que está checando o retorno de _kbhit()...

 

Veja:

image.png.b577a1191ef45cbe4282410151900f8c.png

E no "seu" código:

25 minutos atrás, bilbol disse:

while( _kbhit!=(0) ) {

Ou seja, está aguardando uma tecla.

 

Faz um tempo que fiz algo parecido com o que você quer, se não me engano, atribui o retorno de VkKeyScanEx() ao membro ip.ki.wVk, e depois chamei SendInput(). Se fizer isso dentro de um loop e percorrendo uma string, vai conseguir "simular" o pressionamento de várias teclas.

 

Dê uma lida:

Estruturas de entrada de teclado

VkKeyScanEx()

SendInput()

 

25 minutos atrás, bilbol disse:

não sei onde esta esse botao code

Leia ↓↓↓

  • Curtir 1
  • Solução
Postado

meses atrás eu mostrei duas maneiras de fazer em C e em C++ com fontes e tal. O código está aqui no forum e tem uma discussão que explica a lógica. Eu estava mostrando como escrever menus mas a ideia é claro a mesma.

 

A discussão está nesse artigo

 

10 minutos atrás, bilbol disse:

não sei onde esta esse botao code


Eis o botão code...

 

code.png.419cca9634fc14932acecfd4bf77b38d.png
 

E tem esses artigos...
 

image.png.f70f720c21074b09c694df9c010ee991.png

 

bem no início do forum...

 

De volta ao programa

 

Pode nem considerar o que eu expliquei. A lógica do que você quer fazer é simplesmente não usar o buffer da entrada.
Não daquele modo ingênuo que habita este forum por exemplo, tentando usar fflush() ou setbuf() que foram escritas para algo muito diferente.

 

LINE INPUT MODE, Cooked Mode, Raw MODE

 

O Windows chama o modo de leitura do teclado de LINE INPUT MODE e está claro associado ao ECHO MODE. Unix e derivados usam a noção de Cooked/raw mode. Eu devo ter explicado isso na discussão que postei e não vou fazer isso de novo aqui.

 

Eis o resumo:

 

A entrada via teclado em geral espera um ENTER. É uma questão de eficiência e inteligência: se retornar antes do ENTER em geral é uma m3rd@ porque por exemplo você não pode corrigir um erro usando backspace e as setas e reescrevendo o que errou. Então seu programa para e fica esperando o resultado da leitura, mesmo que seja uma letra só. Mas você pode ir digitando, voltando e corrigindo até o ENTER.

 

No entanto por exemplo em um jogo onde você usa ASWZ para mover o cursor ou as setas e fazer um bloco andar na ela, você não pode imaginar um prompt dizendo "digite  a direção para onde quer ir e tecle ENTER" ... :D 

 

É o que acontece com seu programa.

 

Em Windows uma maneira de fazer isso é ler o buffer de teclado e não o teclado, como eu mostrei nos programas. Usando PeekConsoleInputBuffer(). É bem simples.

 

Mas entenda que se desligar o lance de LINE INPUT funções como fgetc() e read() e scanf() e tudo que ler de stdin vão ler sempre o que tiver para ser lido e o programa não para. E se desligar também o ECHO pode escolher se vai mostrar o que foi digitado, porque as vezes não se quer e às vezes precisa esperar pra ver se tem um backspace depois :) 

 

Isso se faz chamando SetConsoleMode()  no Windows e ioctl() no Linux. No Linux se manipula os valores de VMIN e VTIME, em geral para ZERO mesmo. No Windows é só um shor int se bem me lembro

 

 

 

  • Curtir 1
  • Obrigado 1
Postado

@Lucca Rodrigues voce entendeu errado. O meu codigo funciona perfeitamente, só colocar ele em rodar que ele ficar pressionando teclas infinitamente mas eu gostaria que ele rodasse em segundo plano exemplo.: eu minimizo o compilador e abro o wordpad dai no wordpad a tecla começa a se repetir no texto, porém isso não ocorre, o código para ao minimizar ou até mesmo clicar fora de sua janela.

  • Curtir 1
Postado
3 minutos atrás, bilbol disse:

mas eu gostaria que ele rodasse em segundo plano exemplo.: eu minimizo o compilador e abro o wordpad dai no wordpad a tecla começa a se repetir no texto, porém isso não ocorre, o código para ao minimizar ou até mesmo clicar fora de sua janela

 

Não é exatamente como explicou. Imagino que tenha lido o que eu te expliquei ao menos. O programa continua rodando ao ser minimizado, e está de fato rodando. Mas para esperando a leitura. 

 

Rodar minimizado era do tempo do DOS nos '80. No Windows é o esperado.

  • Curtir 2
Postado

@bilbol Isso é porque você deve ter dado um zoom na página. Deixe com 100% e todas as ferramentas aparecem.

 

É como @arfneto disse, está parando para ler:

55 minutos atrás, bilbol disse:

printf( "\nKey struck was '%c'\n", _getch());

Nem tinha visto esta linha. Poste sempre com o botão code, pois ajuda na visualização, e a Indentação também é importante.

 

20 minutos atrás, bilbol disse:

O meu codigo funciona perfeitamente

O seu né... Achei seu código aqui 😑

  • Curtir 1
Postado
37 minutos atrás, arfneto disse:

De volta ao programa

 

Pode nem considerar o que eu expliquei. A lógica do que você quer fazer é simplesmente não usar o buffer da entrada.
Não daquele modo ingênuo que habita este forum por exemplo, tentando usar fflush() ou setbuf() que foram escritas para algo muito diferente.

 

LINE INPUT MODE, Cooked Mode, Raw MODE

 

O Windows chama o modo de leitura do teclado de LINE INPUT MODE e está claro associado ao ECHO MODE. Unix e derivados usam a noção de Cooked/raw mode. Eu devo ter explicado isso na discussão que postei e não vou fazer isso de novo aqui.

 

Eis o resumo:

 

A entrada via teclado em geral espera um ENTER. É uma questão de eficiência e inteligência: se retornar antes do ENTER em geral é uma m3rd@ porque por exemplo você não pode corrigir um erro usando backspace e as setas e reescrevendo o que errou. Então seu programa para e fica esperando o resultado da leitura, mesmo que seja uma letra só. Mas você pode ir digitando, voltando e corrigindo até o ENTER.

 

No entanto por exemplo em um jogo onde você usa ASWZ para mover o cursor ou as setas e fazer um bloco andar na ela, você não pode imaginar um prompt dizendo "digite  a direção para onde quer ir e tecle ENTER" ... :D 

 

É o que acontece com seu programa.

 

Em Windows uma maneira de fazer isso é ler o buffer de teclado e não o teclado, como eu mostrei nos programas. Usando PeekConsoleInputBuffer(). É bem simples.

 

Mas entenda que se desligar o lance de LINE INPUT funções como fgetc() e read() e scanf() e tudo que ler de stdin vão ler sempre o que tiver para ser lido e o programa não para. E se desligar também o ECHO pode escolher se vai mostrar o que foi digitado, porque as vezes não se quer e às vezes precisa esperar pra ver se tem um backspace depois :) 

 

Isso se faz chamando SetConsoleMode()  no Windows e ioctl() no Linux. No Linux se manipula os valores de VMIN e VTIME, em geral para ZERO mesmo. No Windows é só um shor int se bem me lembro

 

caramba, eu li o seu texto e só consegui entender que textos requerem ENTER, removi o texto e agora o código funciona do jeito que eu queria haha, muito obrigado!

Citação

 

 

 

 

Postado

@bilbol

10 minutos atrás, bilbol disse:

só conseguir entender que textos requerem ENTER

Não é bem isso não... Como "textos" requerem Enter?

 

Funções como

45 minutos atrás, arfneto disse:

fgetc() e read() e scanf()

Aguardam um Enter, isso sim, mas se você

45 minutos atrás, arfneto disse:

desligar o lance de LINE INPUT

Então... Não mais.

 

36 minutos atrás, bilbol disse:

voce entendeu errado.

Sim e não. Como você disse:

2 horas atrás, bilbol disse:

gostaria que o Z estivesse sendo digitado sem parar

E bem...

1 hora atrás, bilbol disse:

/* Display message until key is pressed. */
while( _kbhit!=(0) ) {

Com isso, ainda há a possibilidade de parar, talvez de uma forma não tão casual :D

Só não tinha visto a tal da _getch() lá, que é outro problema.

  • Curtir 1
Postado
56 minutos atrás, bilbol disse:

@arfneto o meu não tem esse botão até printei a tela rs, vou da uma olhada no seu link e ve se tem alguma relação.

nao tem botao.png

Sim. O software do forum tem problemas. às vezes esse botão <> desaparece. E o editor é medíocre. 

Vai aparecer em geral. Tenha paciência. Imagino que os caras do forum saibam do problema. É assim desde 2019 e teve um upgrade ao menos

  • Haha 1
Postado
5 minutos atrás, arfneto disse:

Sim. O software do forum tem problemas. ãs vezes esse botão e o <> desaparecem. E o editor é medíocre. 

Vai aparecer em geral.

valeu mestre, por ser tão afável quanto a minha conduta.

  • Curtir 1
Postado
agora, bilbol disse:

valeu mestre, por ser tão afável quanto a minha conduta

 

:D queixas para Invision Comunity que escreve o software do forum.

 

image.png.86f730a755148dadaaa14e4f2b9c8b46.png

 

Como vê, o tal botão existe.

 

 

42 minutos atrás, bilbol disse:

caramba, eu li o seu texto e só consegui entender que textos requerem ENTER

 

Bem, talvez deva ler de novo ou perguntar algo objetivamente :)

 

Funciona da maneira como eu expliquei

 

 

 

  • Curtir 2

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...