GetAsyncKeyState not working? Look here!

Especially when running on a 64-bit system you may run into problems. To ensure your application works on 32-bit and 64-bit you have to make some small changes to the API declaration.

To make something clear: Even though it says “user32.dll” it is actually a dll with 64-bit functions. The 32-bit version of it is in the WOW64 folder.
wrap-lines: true
This is the code I am using:

1
2
3
4
5
6
7
8
9
10
11
12
13
using System.Runtime.InteropServices;
    static class VKeyboard
    {
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern IntPtr GetAsyncKeyState(IntPtr vKey);
 
        public static bool CheckKeyDown(System.Windows.Forms.Keys vKey)
        {
 
            return 0 != ((Int64)GetAsyncKeyState((IntPtr)vKey) & 0x8000);
 
        }
    }

To call this just use:

1
2
3
4
if (VKeyboard.CheckKeyDown(Keys.ControlKey))
{
//do something
}

The integer types were changed to IntPtr because IntPtr is a wrapper that changes depending on the system (32-bit or 64-bit). You can change vKey as well to IntPtr to save the typecast but I like the “Keys.” calling method.

Enjoy.

One thought on “GetAsyncKeyState not working? Look here!

Leave a message

Your email address will not be published. Required fields are marked *

*