Pergunta

Estou a fazer Um programa em c++ pressiona as teclas no teclado automaticamente para mim.Eu tenho feito isso com cada tecla no teclado.Ele funciona perfeitamente, EXCETO quando eu estou tentando usar entre colchetes '['.Se eu dizer ao computador para imprimir um colchete, imprime o colchete como esperado, mas também pressiona o botão iniciar do windows e, portanto, abrir o menu de iniciar?Depois de alguns depuração eu achei que o menu iniciar só apareceu depois que o SendInput função foi usada para LIBERAR A CHAVE não quando foi pressionado.Então a minha pergunta é POR que isso está acontecendo?PS Antes que alguém pergunte, meu código é 100% correto, para cada chave, então eu sei que o método que eu estou usando o works.

ip.ki.wVk = VK_OEM_4; // this is the '[' key
ip.ki.dwFlags = 0;
SendInput(1, &ip, sizeof(INPUT)); // the key has been pressed

ip.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &ip, sizeof(INPUT)); // the key is released, THE START MENU POPS UP!
Foi útil?

Solução

Eu não posso reproduzir esse, aqui é o meu código mínimo:

#include <Windows.h>

int main() {
    INPUT ip = {0};

    ip.type = INPUT_KEYBOARD;
    ip.ki.wVk = VK_OEM_4;

    Sleep(2000);

    SendInput(1, &ip, sizeof ip);

    ip.ki.dwFlags = KEYEVENTF_KEYUP;

    // Note: Adding some kind of delay here might be a good idea.

    SendInput(1, &ip, sizeof ip);

    return 0;
}

Verifique se isso funciona para você, para ver se é um problema com o programa ou algum tipo de layout de teclado problema.

Isso corretamente prensas [ no meu PC e não abra o menu iniciar, mas, por favor, note que depende de layout de teclado mapeamento VK_OEM_4 para [ o que pode não ser o caso de alguns layouts.Você poderia usar VkKeyScanEx para traduzir um personagem virtual-chave do código.

Alguns palpites por que o seu programa se comporta como você descreveu:talvez você não seja a anulação de seu INPUT estrutura (com = {0} ou memset) e contém algumas lixo valores, ou acidental, simulando algum tipo de combinação de teclas que acontece para abrir o menu iniciar, ou talvez haja algum erro no seu código, mas que é impossível de dizer, porque você não o show completo exemplo, existem muitas possibilidades.

Também, se você quiser enviar caracteres, usando valores Unicode pode ser mais portátil:

#include <Windows.h>

int main() {
    INPUT ip = {0};

    ip.type = INPUT_KEYBOARD;
    ip.ki.dwFlags = KEYEVENTF_UNICODE;
    ip.ki.wScan = 0x5B; // unicode value for '['

    Sleep(2000);

    SendInput(1, &ip, sizeof ip);

    return 0;
}

Isto irá funcionar independentemente do layout de teclado, mas é tecnicamente um pouco diferente, em seguida, simular uma tecla, de modo a utilizar depende do que exatamente você está tentando fazer.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top