Como simular o mouse e o teclado usando C # ou C ++?

8

Quero começar a desenvolver para o Kinect, mas o tema mais difícil - como enviar entrada de teclado e mouse para qualquer aplicativo. Na pergunta anterior, recebi um conselho para desenvolver meu próprio driver para esses dispositivos, mas isso levará um tempo.

Eu imagino um aplicativo como um portão, que pode converter o SendMessage em um aplicativo de entrada ou driver amplo do sistema com API para enviar essas entradas. Então, eu me pergunto, existem drivers ou simuladores que podem interagir com C # ou C ++?

Edição pequena: SendMessage, PostMessage, keybd_event funcionará apenas no aplicativo Windows com loop de mensagens comuns. Então, eu preciso de um aplicativo de driver que funcione em nível baixo, do kernel.

Dracontis
fonte
Parece que você pode estar interessado em software como o Auto Hot Key, que simula o pressionamento de teclas e similares para outro aplicativo ... porém, não tenho certeza absoluta ... apenas um comentário.
James
2
Driver com API, que simulará o teclado real.
Dracontis
Você pode ter mais sorte no StackOverflow, essa pergunta provavelmente é de nível mais baixo do que a maioria dos usuários aqui possui experiência. Posso estar errado.
Deceleratedcaviar
Não consigo fazer perguntas no StackOverflow.
Dracontis
Por que não? O Stackoverflow é definitivamente um ótimo lugar para postar perguntas como essa.
Ultifinitus

Respostas:

2

Para um aplicativo C #:

Para mover o mouse, a classe Cursor é nossa amiga, pois Cursor.Position pode ser usado para mover o mouse.

Para simular o pressionamento de teclas, a classe Sendkeys é sua amiga, com SendKeys.Send () sendo usado para simular um pressionamento de teclado

Para clicar com o mouse, não conheço nenhum bom pacote, mas esse código deve funcionar:

[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);

public const int MOUSEEVENTF_LEFTDOWN = 0x02;
public const int MOUSEEVENTF_LEFTUP = 0x04;
public const int MOUSEEVENTF_RIGHTDOWN = 0x08;
public const int MOUSEEVENTF_RIGHTUP = 0x10;

public void MouseClick()
{
mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0);
}

(Apenas substitua xey pela posição atual do mouse, talvez usando a classe Cursor novamente)

Como alternativa, você pode usar algo como a Biblioteca Global de Mouse e Teclado do CodeProject para uma interface simples e limpa para todo o processo

Jordaan Mylonas
fonte
11
Infelizmente, isso não funcionará para aplicativos DirectInput / XInput.
Jonathan Dickinson
Eventos não funcionarão em todos os aplicativos. Talvez, às vezes, o jogo seja conectado a um loop de mensagens comum e essa biblioteca ou função funcione, mas não em todos. Eu preciso de um aplicativo parecido com um driver.
Dracontis
2

O que você precisa é criar um driver de sistema para um dispositivo de interface humana, HID. O conselho anterior para criar um driver está correto porque, como você notou, você não pode simplesmente incluir eventos em sistemas de nível superior e obter cobertura universal.

Você pode começar aqui: digite a descrição do link aqui e continue procurando no MSDN amostras de drivers para basear seu trabalho.

Patrick Hughes
fonte
11
Também quero acrescentar que, se você usar a abordagem SendMessage, precisará de UIAccess = true no seu manifesto para interagir com aplicativos iniciados como Admin. Fazer isso exige que você tenha seu código assinado digitalmente (caro). Escrever um driver de dispositivo é uma solução melhor / mais correta, mas também requer um driver assinado no x64.
NtscCobalt
1

Bem, a melhor maneira de fazer isso é criar seu próprio driver de teclado / mouse usando o WDK. É uma solução precisa e de boa aparência, mas levará muito tempo se você for iniciante em programação.

Outra solução é usar o GlovePIE . Você pode escrever seu próprio script e usá-lo. Portanto, você precisará enviar uma mensagem com seu aplicativo para o GlovePIE e ele gerará entrada no nível do Kernel, para que isso funcione nos jogos DirectX e nos aplicativos de loop de mensagens.

Bem, eu realmente quero algo parecido com isto, mas com a possibilidade de executar como processo em segundo plano (o GlovePIE começa com o modo de janela e você pode ativá-lo) ou talvez como biblioteca. Se eu encontrar outra coisa, atualizarei a resposta.

Dracontis
fonte