Usuário com melhor resposta
Simulando o Teclado.

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á.
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)- Sugerido como Resposta AndreAlvesLimaModerator quinta-feira, 26 de agosto de 2010 22:35
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 26 de agosto de 2010 22:35
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)- Sugerido como Resposta AndreAlvesLimaModerator quinta-feira, 26 de agosto de 2010 22:35
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 26 de agosto de 2010 22:35
-