2011-12-22 14 views
8

Sto provando a scrivere un programma che prenderà una riga di dati e la passerà in un'altra finestra/processo.C# Invio di comandi da tastiera a un'altra finestra/processo

Questo è il codice che ho finora, ma non sono stato in grado di capire come inviare il comando della tastiera al processo OUTLOOK.

Vorrei poter utilizzare il comando Tab/tasto e il comando Invio/tasto.

Questo è quello che ho provato finora

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); 
    } 
} 

risposta

6

SendMessage è quello che stai cercando. Forse la tua domanda è stato già risolto qui: How to send text to Notepad in C#/Win32?

+0

Ty per la risposta, ma questo non invia un comando da tastiera, per quanto posso vedere solo Pasts testo in – monkeylumps

+0

È possibile impostare un flag per le sequenze di tasti. Per esempio. per il tasto tab: 'SendMessage (hwnd, WM_KEYDOWN, VK_TAB, NULL)' – arminb

1

Considerando che si sa quando e cosa comando da tastiera vuoi inviare al processo di Outlook, è necessario utilizzare SendMessage funzione API di Windows.

Solo 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(); 
    } 
} 

Prova smth come questo.

+4

'SendKeys' non funziona correttamente. Fai finta di portare in primo piano un'altra finestra. In questo caso invierai le tue chiavi all'applicazione sbagliata. – arminb

+1

Ecco perché è stato fatto con SendWait e poi si svuota. – Elastep

+0

Ci scusiamo per la resurrezione, ma qualche idea su come posso fare questo - su internet? Ho bisogno di fare essenzialmente la stessa cosa, ma l'applicazione/processo di destinazione è in esecuzione su un'altra macchina! – pookie

5

Ho scritto un paio di programmi che inviano sequenze di tasti alle finestre in background, in genere ho implementato PostMessage/SendMessage. Ho documentato tutti i miei risultati here!

Ma in pratica si utilizzerà una chiamata di livello basso per inserire messaggi nella coda dei messaggi di Windows per consentire all'applicazione di riprendere i tasti premuti.

PostMessage

SendMessage

Per favore fatemi sapere se avete domande, la mia biblioteca è scritto in C# e sarei felice di condividerlo. Questo metodo permette anche per l'uso del mouse in una finestra di sfondo :)

Tutto il codice è stato controllato in GitHub: https://github.com/EasyAsABC123/Keyboard