web-dev-qa-db-fra.com

C # utilisant la fonction Sendkey pour envoyer une clé à une autre application

Je veux envoyer une clé spécifique (par exemple k) à un autre programme nommé bloc-notes, et ci-dessous est le code que j'ai utilisé:

void sendkey ()
{
    [DllImport ("User32.dll")]
    static extern int SetForegroundWindow(IntPtr point);

    Process p = Process.GetProcessesByName("notepad")[0];
    IntPtr pointer = p.Handle;
    SetForegroundWindow(pointer);
    SendKeys.Send("k");
}

Mais le code ne fonctionne pas, quel est le problème avec le code?

Modifié: est-il possible que j'envoie le "K" au bloc-notes sans bloc-notes pour être la fenêtre active? (par exemple, fenêtre active = "Google Chrome", le bloc-notes est à l'arrière-plan, ce qui signifie l'envoi d'une clé à une application d'arrière-plan)

25
User2012384

Si le bloc-notes est déjà démarré, vous devez écrire:

// import the function in your class
[DllImport ("User32.dll")]
static extern int SetForegroundWindow(IntPtr point);

//...

Process p = Process.GetProcessesByName("notepad").FirstOrDefault();
if( p != null)
{
    IntPtr h = p.MainWindowHandle;
    SetForegroundWindow(h);
    SendKeys.SendWait("k");
}

GetProcessesByName renvoie un tableau de processus, vous devriez donc obtenir le premier (ou trouver celui que vous voulez).

Si vous voulez démarrer notepad et envoyer la clé, vous devez écrire:

Process p = Process.Start("notepad.exe");
p.WaitForInputIdle();
IntPtr h = p.MainWindowHandle;
SetForegroundWindow(h);
SendKeys.SendWait("k");

La seule situation dans laquelle le code peut ne pas fonctionner est lorsque notepad est démarré en tant qu'administrateur et que votre application ne l'est pas.

45
Mohammad Dehghan