SendInput() pressionar o botão iniciar ao enviar '[' ??c++
-
21-12-2019 - |
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!
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.