SendKey.Send() Not working

21,880

Solution 1

You can use WinAPI instead of SendKeys:

[DllImport("user32.dll", SetLastError = true)]
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
public static void PressKey(Keys key, bool up) {
    const int KEYEVENTF_EXTENDEDKEY = 0x1;
    const int KEYEVENTF_KEYUP = 0x2;
    if (up) {
        keybd_event((byte) key, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, (UIntPtr) 0);
    }
    else {
        keybd_event((byte) key, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr) 0);
    }
}

void TestProc() {
    PressKey(Keys.ControlKey, false);
    PressKey(Keys.P, false);
    PressKey(Keys.P, true);
    PressKey(Keys.ControlKey, true);
}

Solution 2

In WPF applications you have to use SendKeys.SendWait() (English Documentation) instead.

Just doublechecked it, while Send() is working for WinForms application, WPF throws an InvalidOperationException although both target .net 4.0.

Check above link for more information.

Share:
21,880
Ziad Akiki
Author by

Ziad Akiki

Updated on July 10, 2020

Comments

  • Ziad Akiki
    Ziad Akiki almost 4 years

    I'm using WPF and I imported the System.Windows.Form reference. Here's my code:

    Process[] process = Process.GetProcessesByName("wmplayer");
    SetForegroundWindow(process[0].MainWindowHandle);
    Thread.Sleep(200);
    System.Windows.Forms.SendKeys.Send("^p");
    

    The Windows Media Player do Focus, but no keystroke is Received. Why?