2011-12-22 30 views
8

Estoy tratando de escribir un programa que tomará una línea de datos y la pasará a otra ventana/proceso.C# Enviando comandos de teclado a otra ventana/proceso

Este es el código que tengo hasta ahora, pero no he podido averiguar cómo enviaría el comando del teclado al proceso OUTLOOK.

Me gustaría poder utilizar el comando Tab/tecla y la tecla Entrar /.

Esto es lo que he probado hasta ahora

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Threading; 
using System.Runtime.InteropServices; 
using System.Diagnostics; 
using System.Windows.Forms; 

namespace Config 
{ 
    class Program 
    { 
     [STAThread] 
     static void Main(string[] args) 
     { 
      System.Threading.Thread.Sleep(30);//300000 
      TextReader tr = new StreamReader("config.txt"); 
      Clipboard.SetText(tr.ReadLine()); 
      tr.Close(); 

      var proc = Process.GetProcessesByName("OUTLOOK").FirstOrDefault(); 
      if (proc != null && proc.MainWindowHandle != IntPtr.Zero) 
      { 
       SetForegroundWindow(proc.MainWindowHandle); 
       //SendKeys.Send("{ENTER}"); 
       // Clipboard.GetText(); 
      } 
     } 

     [DllImport("user32")] 
     private static extern bool SetForegroundWindow(IntPtr hwnd); 
    } 
} 

Respuesta

6

SendMessage es lo que estás buscando. Tal vez su pregunta ya se resolvió aquí: How to send text to Notepad in C#/Win32?

+0

Ty por la respuesta, pero esto no envía un comando de teclado por lo que puedo ver que sólo pasados ​​texto en – monkeylumps

+0

Puede establecer un indicador para las pulsaciones de teclas. P.ej. para la tecla de tabulación: 'SendMessage (hwnd, WM_KEYDOWN, VK_TAB, NULL)' – arminb

1

Teniendo en cuenta que usted sabe cuando y lo comando del teclado que va a enviar al proceso de Outlook, es necesario utilizar SendMessage función API de Windows.

Sólo un sample

7
[DllImport("user32.dll")] 
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

[DllImport("user32.dll")] 
private static extern bool SetForegroundWindow(IntPtr hWnd); 

public void Start() 
{ 
    IntPtr zero = IntPtr.Zero; 
    for (int i = 0; (i < 60) && (zero == IntPtr.Zero); i++) 
    { 
     Thread.Sleep(500); 
     zero = FindWindow(null, "YourWindowName"); 
    } 
    if (zero != IntPtr.Zero) 
    { 
     SetForegroundWindow(zero); 
     SendKeys.SendWait("{TAB}"); 
     SendKeys.SendWait("{TAB}"); 
     SendKeys.SendWait("{ENTER}"); 
     SendKeys.Flush(); 
    } 
} 

Try Smth como este.

+4

'SendKeys' no funciona. Imagina que otra ventana se lleva al primer plano. En este caso, enviaría sus claves a la aplicación incorrecta. – arminb

+1

Es por eso que se hace con SendWait y luego se vacía. – Elastep

+0

Perdón por la resurrección, pero ¿alguna idea de cómo puedo hacer esto? ¿Sobre Internet? Necesito hacer esencialmente lo mismo, pero la aplicación/proceso objetivo se ejecuta en otra máquina. – pookie

5

He escrito un par de programas que envían las teclas a ventanas de fondo, generalmente implementé PostMessage/SendMessage. ¡Documenté todos mis hallazgos here!

Pero básicamente utilizará una llamada c de bajo nivel para poner mensajes en la cola de mensajes de Windows para permitir que la aplicación tome las teclas presionadas.

PostMessage

SendMessage

Por favor, hágamelo saber si usted tiene alguna pregunta, mi biblioteca está escrito en C# y yo estaría feliz de compartirlo. Este método también permite el uso del ratón en una ventana de fondo :)

Todo el código se registró en GitHub: https://github.com/EasyAsABC123/Keyboard