SendMessage, When To Use KEYDOWN, SYSKEYDOWN, etc?

13,369

Microsoft explains the difference between these WM messages here Keyboard Input (Windows).

WM_SYSKEYDOWN simulates system commands like ALT + TAB used to switch windows.

WM_CHAR simulates user input like input in a text box for instance.

WM_KEYDOWN is usually used together with WM_KEYUP. See WM_KEYDOWN message (Windows).

Most probably you will want to use WM_CHAR.

Share:
13,369
Jan Tacci
Author by

Jan Tacci

Hello.

Updated on June 23, 2022

Comments

  • Jan Tacci
    Jan Tacci almost 2 years

    I am writing an application that sends keystrokes to another application using SendMessage.

    [DllImport("user32.dll")]
    public static extern int SendMessage(IntPtr hWnd, int Msg, uint wParam, uint lParam);
    

    I have been experimenting with the various arguments and I have noticed that, depending on which keystroke I am sending, I have to pass in different arguments to the parameter int Msg.

    For example, I have the following defined as possible values for Msg.

    private static ushort WM_SYSKEYDOWN = 0x0104;
    private static ushort WM_CHAR = 0x0102;
    private static ushort WM_KEYDOWN = 0x0100;
    

    and the following test keys that are passed in to the 3rd parameter wParam:

    private static ushort VK_F1 = 0x70;
    private static ushort VK_A = 0x41;
    private static ushort VK_TAB = 0x09;
    

    When I want to send the F1 key (VK_F1) it only works whenever is use WM_SYSKEYDOWN, when I want to send the A key it only works when I use WM_CHAR, and when I want to send the TAB key it only works when I use WM_KEYDOWN.

    My question is: is there some documentation out there that tells me when to use WM_KEYDOWN, WM_SYSKEYDOWN, etc. based on what key that is being sent? Or perhaps I am doing it wrong and there is one consistent method that works for any key?

    • Sebastian Cabot
      Sebastian Cabot over 11 years
      why not use SendInput and let the OS worry about the messages?