Automação de Digitação em C# utilizando a API keybd_event do Windows

A simulação de entrada de teclado é uma técnica comum em automação de tarefas e integração de sistemas onde APIs convencionais não estão disponíveis. No ecossistema .NET, isso pode ser alcançado através da invocação de funções nativas do Windows (P/Invoke), especificamente utilizando a user32.dll.

1. Importação da API Nativa

Para interagir com o subsistema de entrada do Windows, utilizamos a função keybd_event. Esta função sintetiza pressionamentos de teclas enviando mensagens diretamente ao driver de teclado.

using System;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.Threading;

public class SimuladorTeclado
{
    [DllImport("user32.dll")]
    private static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);

    private const uint KEYEVENTF_KEYUP = 0x0002;
    private const uint KEYEVENTF_KEYDOWN = 0x0000;
}

2. Mapeamento de Códigos de Teclas Virtuais

O Windows identifica as teclas através de Virtual-Key Codes (VK). Para facilitar o uso, podemos estruturar um dicionário que mapeia caracteres comuns aos seus respectivos bytes hexadecimais.

private static readonly Dictionary<char, byte> MapaTeclas = new Dictionary<char, byte>
{
    {'A', 0x41}, {'B', 0x42}, {'C', 0x43},
    {'1', 0x31}, {'2', 0x32}, {'.', 0x6E},
    {'-', 0x6D}, {' ', 0x20}
};

3. Simulação de Digitação de Texto

Ao processar uma string para simular a digitação, é crucial considerar o tempo de resposat do sistema operacional. Enviar comandos de forma excessivamente rápida pode resultar na perda de caracteres.

public static void EnviarTexto(string conteudo)
{
    foreach (char c in conteudo.ToUpper())
    {
        if (MapaTeclas.ContainsKey(c))
        {
            byte vk = MapaTeclas[c];
            // Pressiona a tecla
            keybd_event(vk, 0, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(20); 
            // Libera a tecla
            keybd_event(vk, 0, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(30);
        }
    }
}

4. Execução de Atalhos e Combinações de Teclas

Para simular atalhos como "Ctrl + V", devemos seguir uma ordem lógica: pressionar as teclas modificadoras, pressionar a tecla de ação, liberar a tecla de ação e, por fim, liberar as modificadoras.

public static void SimularColar()
{
    const byte VK_CONTROL = 0x11;
    const byte VK_V = 0x56;

    // Segura CTRL e pressiona V
    keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYDOWN, 0);
    keybd_event(VK_V, 0, KEYEVENTF_KEYDOWN, 0);

    // Libera V e depois libera CTRL
    keybd_event(VK_V, 0, KEYEVENTF_KEYUP, 0);
    keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
}

5. Simulação da Tecla Enter com Delay

Algumas ações exigem um intervalo maior para que a interface gráfica processe o comando, como no caso da tecla Enter após preencher um formulário.

public static void PressionarEnter()
{
    const byte VK_RETURN = 0x0D;

    keybd_event(VK_RETURN, 0, KEYEVENTF_KEYDOWN, 0);
    // Pausa necessária para emular o comportamento humano e processamento do SO
    Thread.Sleep(50); 
    keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);
}

Tags: C# Win32-API PInvoke automation dotnet

Publicado em 8-9 07:48