Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SendKey.Send() Not working

Tags:

c#

forms

wpf

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?

like image 356
Ziad Akiki Avatar asked Jul 09 '12 20:07

Ziad Akiki


2 Answers

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);
}
like image 124
Alex Butenko Avatar answered Oct 15 '22 12:10

Alex Butenko


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.

like image 34
nik Avatar answered Oct 15 '22 13:10

nik