none
Simulando o Teclado. RRS feed

  • Pergunta

  • Olá!

    Estou a mais de uma semana tentando resolver esse meu problema com um teclado simulado.

    O grande problema é que preciso simular ele em outra aplicação que NÃO esteja em foco.

    Eu achei um comando que funcionou perfeitamente mas ele apenas simula 1 teclado se 1 palavra for usada:

    [i]"[DllImport("user32.dll")]
    static extern bool PostMessage(IntPtr hWnd, int Msg, uint wParam, int lParam);

     

    Por exemplo:

    private const int F1 = 0x70; //Declarando o codigo do F1

    internal static void TeclaSimulada(string s)

    IntPtr hWnd = Client.MainWindowHandle;

    #region Keys switch
                switch (s.ToUpper())

    {

    case "F1"

    PostMessage(hWnd, WM_KEYUP, CONTROL, 0);
    PostMessage(hWnd, WM_KEYUP, SHIFT, 0);
    PostMessage(hWnd, WM_KEYDOWN, F1, 0);
    PostMessage(hWnd, WM_KEYUP, F1, 0);
    break;"[/i]

     

    Entao se o meu TeclaSimulada("F1") ele vai apertar o F1 no meu Client mesmo que ele não esteja em foco, até poderia declarar o codigo de todas as teclas (a, b, c ...) mas ai como faria para ler uma palavra ou frase por exemplo e converter ela para pegar cada caracter e esses caracteres serem simulados?

    Parece meu complicado mas acho que vocês com mais conhecimento poderao me ajudar melhor ^^

    Obrigado desde já.

    quinta-feira, 26 de agosto de 2010 02:30

Respostas

  • Maozao,

    Escrevi um código que faz isto, você passa o texto como string e ele retorna a representação numérica do caractere.

    Fiz também um tratamento para você poder enviar teclas especiais, então você deve usar assim:

    GetKeys("Texto{Enter}");

    ou

    GetKeys("Texto{F1}");

    Sempre que você colocar o {}, ele irá procurar a representação na classe Keys, então você pode usar qualquer tecla que tiver lá.

      public double[] GetKeys(string text)
      {
       List<double> result = new List<double>();
    
       bool inGroup = false;
       string currentKey = "";
       for (int i = 0; i < text.Length; i++)
       {
        // pega a letra...
        char key = text[i];
        // verifica se está em um grupo...
        if (inGroup)
        {
         // fecha o grupo...
         if (key != '}')
          currentKey += key;
         else
         {
          FieldInfo field = typeof(Keys).GetField(currentKey, BindingFlags.Public | BindingFlags.Static);
          if (field != null)
           result.Add(Convert.ToDouble(field.GetValue(null)));
          inGroup = false;
          currentKey = "";
         }
        }
        else
        {
         // verifica se está começando um grupo...
         if (key == '{')
          inGroup = true;
         else
         {
          // adiciona a tecla...
          result.Add((double)key);
         }
        }
       }
    
       return result.ToArray();
      }
    
    

    At., 


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    quinta-feira, 26 de agosto de 2010 13:04

Todas as Respostas

  • Maozao,

    Escrevi um código que faz isto, você passa o texto como string e ele retorna a representação numérica do caractere.

    Fiz também um tratamento para você poder enviar teclas especiais, então você deve usar assim:

    GetKeys("Texto{Enter}");

    ou

    GetKeys("Texto{F1}");

    Sempre que você colocar o {}, ele irá procurar a representação na classe Keys, então você pode usar qualquer tecla que tiver lá.

      public double[] GetKeys(string text)
      {
       List<double> result = new List<double>();
    
       bool inGroup = false;
       string currentKey = "";
       for (int i = 0; i < text.Length; i++)
       {
        // pega a letra...
        char key = text[i];
        // verifica se está em um grupo...
        if (inGroup)
        {
         // fecha o grupo...
         if (key != '}')
          currentKey += key;
         else
         {
          FieldInfo field = typeof(Keys).GetField(currentKey, BindingFlags.Public | BindingFlags.Static);
          if (field != null)
           result.Add(Convert.ToDouble(field.GetValue(null)));
          inGroup = false;
          currentKey = "";
         }
        }
        else
        {
         // verifica se está começando um grupo...
         if (key == '{')
          inGroup = true;
         else
         {
          // adiciona a tecla...
          result.Add((double)key);
         }
        }
       }
    
       return result.ToArray();
      }
    
    

    At., 


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    quinta-feira, 26 de agosto de 2010 13:04
  • Obrigado, abriu meus olhos e consegui fazer funcionar =)

     

    Abraços!

    quinta-feira, 26 de agosto de 2010 21:27