【问题标题】:C# KeyEventArgs giving out wrong outputs when caps is onC# KeyEventArgs 在大写打开时给出错误的输出
【发布时间】:2014-03-19 03:40:13
【问题描述】:

当窗口失焦时,我使用global keyboard hooks 作为键盘监听器。我已经完成了一些代码,我意识到无论出于何种原因,将大写锁定更改KeyEventArgs 的输出。使用 shift/no shift 输出普通结果,但如果我将大写锁定打开,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 可以正常工作。

【问题讨论】:

  • 与您的问题完全无关,但为什么不使用@"C:\Users\... 设置location 并使其更具可读性?我认为@location 不会产生任何影响,因为location 的值已经通过使用转义的反斜杠设置为C:\Users\...
  • 我最初使用每个 file.appendalltext 中的位置,并假设您仍然必须使用 @。修复它,工作正常。谢谢。 ;)

标签: c# keyboard keylistener keyeventargs


【解决方案1】:

您链接到的globalKeyboardHook 类有一个AddModifiers(Keys key) 方法,其中包含这一行:

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

此代码检查 Cap Lock 是否打开,如果打开,则对稍后由该方法返回的 key 变量进行 OR 运算。

问题在于 Caps Lock 不是修饰键,不应该以这种方式进行操作。这就是您在 Caps Lock 开启时看到奇怪的键值的原因。

顺便说一句,只有 Control、Shift 和 Alt 是修饰键,AddModifiers() 处理这些。

如果你删除这条线,我相信你会没事的。

【讨论】:

  • 谢谢!有效。我总是犯一些常见的、简单的错误,但我认为我永远不会自己发现/修复它。
  • @HaydenPerry 很高兴我能提供帮助。你就像我一样:如果有问题,那一定是我们做错了什么。我们必须停止这样做。真正有帮助的一件事是在gkh_KeyDown 的入口点设置一个断点并检查e.KeyCode 的值。
猜你喜欢
  • 2017-04-21
  • 2015-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-08
  • 1970-01-01
相关资源
最近更新 更多