Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SendKeys.Send and Windows Key

Tags:

.net

winforms

I'm trying to make a keyboard trigger for my WinForm application that calls out Windows key + # (# = a number key) shortcut which launches a new instance of the application in the nth slot on the taskbar.

For example, I would like to run Photoshop, which is in the first slot of my taskbar.

WinKey+1

I've heard of the CTRL+ESC alternative, but the code below does not work.

SendKeys.Send("^{ESC}1")

Any other alternatives? Do I need to run a batch file for this?

Thanks! :)

like image 912
demijnzia Avatar asked Jun 20 '11 06:06

demijnzia


People also ask

How do I use SendKeys SendWait?

Use SendWait to send keystrokes or combinations of keystrokes to the active application and wait for the keystroke messages to be processed. You can use this method to send keystrokes to an application and wait for any processes that are started by the keystrokes to be completed.

How do I send SendKeys?

To specify that any combination of SHIFT, CTRL, and ALT should be held down while several other keys are pressed, enclose the code for those keys in parentheses. For example, to specify to hold down SHIFT while E and C are pressed, use "+(EC)".

How do you send a key in PowerShell?

Use the SendKeys Method to Perform Keystrokes Inside PowerShell. You can use the SendKeys() method to send keystrokes to the active application. The AppActivate() method activates the application Notepad so you can send keystrokes to it.

How do I send keystrokes to another app?

There are two methods to send keystrokes to an application: SendKeys. Send and SendKeys. SendWait. The difference between the two methods is that SendWait blocks the current thread when the keystroke is sent, waiting for a response, while Send doesn't.


1 Answers

CTRL+ESC does not simulate the WIN key, it just calls the start menu.

A bit of P/Invoke always makes everyone happy:

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

static class KeyboardSend
{
    [DllImport("user32.dll")]
    private static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);

    private const int KEYEVENTF_EXTENDEDKEY = 1;
    private const int KEYEVENTF_KEYUP = 2;

    public static void KeyDown(Keys vKey)
    {
        keybd_event((byte)vKey, 0, KEYEVENTF_EXTENDEDKEY, 0);
    }

    public static void KeyUp(Keys vKey)
    {
        keybd_event((byte)vKey, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
    }
}

And you call it this way :

KeyboardSend.KeyDown(Keys.LWin);
KeyboardSend.KeyDown(Keys.D4);
KeyboardSend.KeyUp(Keys.LWin);
KeyboardSend.KeyUp(Keys.D4);

Tested, it works. Have fun!

like image 50
user703016 Avatar answered Oct 12 '22 14:10

user703016