I must say that I’am always amazed how many useful things you can perform just by simulating the keystrokes in Windows Mobile. In Windows CE SDK is the function keybd_event which generates WM_KEYUP or WM_KEYDOWN message. In fact it means, that you can “broadcast” the key press through whole system. It’s unbelievable how many functions is binded to the keys even if it’s not physically present on the device.

On this page in MSDN you can find list of many keys supported in Windows CE systems. There are interesting keys like VK_OFF, VK_NONAME, VK_ESC, VK_KEYLOCK. To be honest much better list is in book Programming Microsoft WindowsCe .Net. So let’s look on some of the keys and how to play with them.

Sending application into background

Dreaming of minimizing application in Smartphone? If you want to send your application into background, just like the the back-button do - why not press it from application. Just send the VK_ESC key (0x1B).

Showing the Today screen

How to show today screen? Simulate the “home” button which is represented by F4 key. This VK_F4 has value of 0x73.

Lock the device keys

If you want to lock the device, just like it happens after idle time - you can perform it also by key press. On the Smartphone you need VK_APP6 key (0xC6). On the Pocket PC you will use VK_F22 or VK_KEYLOCK key (0x85). Windows Mobile 6.0 has the API function SHDeviceLockAndPrompt which puts device into a lock state as well.

Preventing the device from locking or sleeping

If you are using for instance TomTom navigation and PIN lock on your device, than you are probably fed up by the screen locking after idle time. You can prevent this locking by simulating key press, so the device will think you are still working on your device. But what key to press? You may think about shift or caps-lock, BUT thEn yOyR uSeR INpuTs WiLL loOk liKE tHiS. It must be the key without affects on the input. The VK_NONAME key (0xFC). Key actually does nothing and is reserved for the future use. In my opinion, the time is here.

Turn off the device

I was really surprised that you can simulate press of the key like power button is. The VK_OFF key (0xDF) performs soft reset on Smartphone and screen off on the Pocket PC.

Activate the Speakerphone

If you will read this post from Peter Foot, you will find how VK_F16 key (0x7F) can be useful, when you want to toggle Speakerphone while talking.

Putting it into C# class

Following class encapsulates SendKey function which simulates press of specified key. Function do two P/Invoke calls to keyb_event with KEYUP and KEYDOWN parameters set. You can use this class in Compact Framework 1.0.

using System.Runtime.InteropServices;

...

public class SystemCalls
{
    //See more at http://msdn2.microsoft.com/en-us/library/ms927178.aspx
    public const byte VK_NONAME  = 0xFC;  // Do nothing
    public const byte VK_ESC     = 0x1B;  // Smartphone back-button
    public const byte VK_F4      = 0x73;  // Home Screen
    public const byte VK_APP6    = 0xC6;  // Lock the keys on Smartphone
    public const byte VK_F22     = 0x85;  // Lock the keys on PocketPC (VK_KEYLOCK)
    public const byte VK_F16     = 0x7F;  // Toggle Speakerphone
    public const byte VK_OFF     = 0xDF;  // Power button

    /// <summary>
    /// Puts `key` into to global keyboard buffer
    /// </summary>
    /// <param name="key"></param>
    public static void SendKey(byte key)
    {
        const int KEYEVENTF_KEYUP = 0x02;
        const int KEYEVENTF_KEYDOWN = 0x00;
        keybd_event(key, 0, KEYEVENTF_KEYDOWN, 0);
        keybd_event(key, 0, KEYEVENTF_KEYUP, 0);
    }

    [DllImport("coredll", SetLastError = true)]
    private static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
}

The class is static so the usage is obvious.

SystemCalls.SendKey(SystemCalls.VK_F22);