2010-06-15 9 views
28

Voglio simulare F5 premere il tasto nel mio programma C#, Quando IE è aperto, desidero aggiornare automaticamente il mio sito Web e non so da dove iniziare.Simulation Key Press C#

grazie,

Dani.

+0

Si tratta di un'applicazione Web o di un'applicazione desktop? – ckramer

+0

Un'app desktop standard. – Dani

+0

In tal caso, penso che il signor Bondy abbia colpito il chiodo sulla testa. – ckramer

risposta

47

Ecco un esempio ...

static class Program 
{ 
    [DllImport("user32.dll")] 
    public static extern int SetForegroundWindow(IntPtr hWnd); 

    [STAThread] 
    static void Main() 
    { 
     while(true) 
     { 
      Process [] processes = Process.GetProcessesByName("iexplore"); 

      foreach(Process proc in processes) 
      { 
       SetForegroundWindow(proc.MainWindowHandle); 
       SendKeys.SendWait("{F5}"); 
      } 

      Thread.Sleep(5000); 
     } 
    } 
} 

uno migliore ... meno anoying ...

static class Program 
{ 
    const UInt32 WM_KEYDOWN = 0x0100; 
    const int VK_F5 = 0x74; 

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

    [STAThread] 
    static void Main() 
    { 
     while(true) 
     { 
      Process [] processes = Process.GetProcessesByName("iexplore"); 

      foreach(Process proc in processes) 
       PostMessage(proc.MainWindowHandle, WM_KEYDOWN, VK_F5, 0); 

      Thread.Sleep(5000); 
     } 
    } 
} 
+2

Questo (specialmente quello "migliore") mi ha aiutato, +1. Vedere la mia risposta [qui] (http://stackoverflow.com/a/16255097/385995) per vedere un esempio più complesso che coinvolge anche i tasti modificatori. –

9

È possibile utilizzare l'API Win32 FindWindow o FindWindowEx per trovare l'handle della finestra del browser aperta e poi basta chiamare SendMessage con WM_KEYDOWN. In genere è più semplice passare la didascalia della finestra a FindWindowEx e trovare l'handle della finestra associato.

Se si avvia il processo del browser tramite un oggetto Process process, è possibile utilizzare process.MainWindowHandle anziché chiamare FindWindowEx.

Spy ++ è uno strumento molto utile quando si desidera iniziare a lavorare con altre finestre. Fondamentalmente ti permette di imparare la gerarchia di un altro programma di elementi dell'interfaccia utente. Puoi anche monitorare tutti i messaggi che entrano nella finestra che stai monitorando. Ho più informazioni in this thread.

Il F5 battitura ha questo codice tasto virtuale:

const int VK_F5 = 0x74; 

Il P/Invoke firma per FindWindowEx in C# è:

[DllImport("user32.dll", SetLastError = true)] 
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); 

Puoi P/Invoke (portare in) API Win32 SendMessage come questo:

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam); 

Quindi, per ricapitolare, si chiamano FindWindowEx direttamente dal tuo codice C# dopo aver inserito il codice sopra da qualche parte all'interno della tua classe. FindWindowEx restituirà un handle di finestra. Quindi, una volta ottenuto l'handle della finestra, è possibile inviare qualsiasi tasto della tastiera alla finestra oppure chiamare molte altre chiamate API Win32 sull'handle della finestra. O anche trovare una finestra figlio utilizzando un'altra chiamata a FindWindowEx. Ad esempio è possibile selezionare il controllo di modifica del browser anche e quindi modificare il suo testo.

Se tutto il resto va male e si pensa che si sta inviando la chiave giusta per la finestra, è possibile utilizzare spy++ per vedere quali messaggi vengono inviati alla finestra quando si imposta manualmente attenzione al browser e si preme manualmente F5.

+0

Puoi essere più dettagliato per favore, io davvero non so come usare l'API Win32. – Dani

+1

Il collegamento al thread SO è praticamente perfetto. Ma forse questo snippet potrebbe aiutare - http://snippets.dzone.com/posts/show/4070 – Reddog

+0

@Dani: ho aggiunto più informazioni, ma puoi cercare il codice di ricerca Google con lang: C# per esempi più dettagliati. http://www.google.com/codesearch?q=lang:c%23+FindWindowEx&hl=it&btnG=Search+Code –

4

Un'altra alternativa alla simulazione di una pressione tasto F5 è quella di ospitare semplicemente il controllo WebBrowser nell'applicazione Window Forms. Si utilizza il metodo WebBrowser.Navigate per caricare la pagina Web e quindi utilizzare uno standard Timer e su ciascun segno di spunta del timer si reindirizza all'URL che ricaricherà la pagina.

+0

La sua soluzione molto semplice. grazie – Dani

2

Invece di costringere un F5 pressione di un tasto quando si sta solo cercando di ottenere la pagina per postback, è possibile chiamare un postback basato su un evento JS (anche MouseMove o timer_tick se si desidera che al fuoco tutto il tempo). Utilizzare il codice allo http://weblogs.asp.net/mnolton/archive/2003/06/04/8260.aspx come riferimento.

2

Il modo più semplice per inviare (simulare) KeyStrokes a qualsiasi finestra consiste nell'utilizzare il metodo SendKeys.Send di .NET Framework.

Acquista questo molto intuitivo articolo di MSDN http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.aspx


In particolare per il vostro caso, se la finestra del browser è a fuoco, l'invio di F5 sarebbe solo comportano la seguente riga di codice:

SendKeys.Send("{F5}"); 
+0

SendKeys non è definito –

4

Semplice uno, aggiungi prima Main

[DllImport("USER32.DLL", CharSet = CharSet.Unicode)] 
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 
[DllImport("USER32.DLL")] 
public static extern bool SetForegroundWindow(IntPtr hWnd); 

Codice insid E Main/Metodo:

string className = "IEFrame"; 
string windowName = "New Tab - Windows Internet Explorer"; 
IntPtr IE = FindWindow(className, windowName); 
if (IE == IntPtr.Zero) 
{ 
    return; 
} 
SetForegroundWindow(IE); 
InputSimulator.SimulateKeyPress(VirtualKeyCode.F5); 

Nota:

  1. Aggiungi InputSimulator come riferimento. Per scaricare Click here

  2. Per trovare il nome della finestra &, utilizzare WinSpy ++. Per scaricare Click here

Problemi correlati