2009-05-05 7 views
9

Sto avviando un processo da un'applicazione Windows. Quando premo un pulsante, desidero simulare la pressione del tasto F4 in questo processo. Come lo posso fare?Come posso inviare il tasto F4 a un processo in C#?

[Modifica successiva] Non voglio simulare la pressione della chiave F4 nel mio modulo, ma nel processo che ho avviato.

risposta

10

Per inviare il tasto F4 per un altro processo si dovrà attivare quel processo

http://bytes.com/groups/net-c/230693-activate-other-process suggerisce:

  1. Get istanza di classe processo restituito dal Process.Start
  2. Query Process.MainWindowHandle
  3. Chiama la funzione API Win32 non gestita "ShowWindow" o "SwitchToThisWindow"

Si può quindi essere in grado di utilizzare System.Windows.Forms.SendKeys.Send ("{} F4") come Reed ha suggerito di inviare le sequenze di tasti a questo processo

EDIT:

L'esempio di codice di seguito viene eseguito blocco note e invia "ABC" ad esso:

using System; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 

namespace TextSendKeys 
{ 
    class Program 
    { 
     [DllImport("user32.dll")] 
     static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 

     static void Main(string[] args) 
      { 
       Process notepad = new Process(); 
       notepad.StartInfo.FileName = @"C:\Windows\Notepad.exe"; 
       notepad.Start(); 

       // Need to wait for notepad to start 
       notepad.WaitForInputIdle(); 

       IntPtr p = notepad.MainWindowHandle; 
       ShowWindow(p, 1); 
       SendKeys.SendWait("ABC"); 
      } 
    } 
} 
+0

Puoi essere più esplicito su come posso impostare un altro processo attivo? Voglio dire potresti pubblicare un esempio di codice? –

+2

Puoi evitare la sospensione usando notepad.WaitForInputIdle() - In questo modo funzionerà su macchine diverse dal tuo :-) – Juanma

+0

grazie, ho pensato che ci sarebbe stato un modo migliore, ho aggiornato la mia risposta :) –

10
+1

Grazie per le risposte veloci. Voglio inviare la chiave F4 al processo avviato dal mio modulo, non al mio modulo. –

+0

Questo è corretto. Da una nota nella pagina MSDN collegata sopra: Poiché non esiste un metodo gestito per attivare un'altra applicazione, è possibile utilizzare questa classe all'interno dell'applicazione corrente o utilizzare metodi nativi di Windows, come FindWindow e SetForegroundWindow, per forzare l'attivazione su altre applicazioni. Quindi è necessario attivare la finestra, quindi SendKeys F4. –

+0

... apparentemente le interruzioni di riga nei commenti vengono eliminate. L'ultima riga sopra (Quindi ...) è la mia. –

1

è possibile mettere a fuoco la finestra (SetForegroundWindow WINAPI), e quindi utilizzare Windows Form SendKeys per inviare F4.

+0

Puoi cambiare il focus programmatico ** solo ** se l'altro programma lo consente. La maggior parte dei programmi non lo consente. –

+0

ShowWindow come nell'esempio principale non ha funzionato per me; ha fatto solo SetForegroundWindow. – dudeNumber4