C#注意按下某个键

时间:2012-01-22 22:26:25

标签: c# keyboard-shortcuts

您好我正在执行一个程序,该程序会在按下特定键时发出通知并写下该人正在写的特定字母。 但我有一个问题,那就是我不想将程序作为“制作程序”。相反,我确实希望它触发并写出用户正在写的用于按键的特定字母或文字...

我希望你理解并感谢所有的帮助

这是我到目前为止的代码:

        static void Main(string[] args)
    {

        while (true)
        {
            ConsoleKeyInfo cki;
            cki = Console.ReadKey();
            Console.WriteLine(cki.Key.ToString());

            if (cki.Key.ToString() == "A" && (cki.Modifiers & ConsoleModifiers.Control) != 0)
            {
                System.Threading.Thread.Sleep(400);
                TSendKeys.SendWait("ø");
            }
        }
    }

3 个答案:

答案 0 :(得分:0)

  

但是我有一个问题,那就是我不想要了   程序作为“maked one”。相反,我确实希望它能够触发和写入   输出用户以用户身份书写的特定字母或文本   正在按键......

读这个我认为你在谈论Windows Hooks。 这意味着用户在另一个应用程序中打印一些东西,比方说Word,但你能够捕获该密钥(即使它没有在你的应用程序中按下)。如果这是您真正想要的,this CodeProject文章就是您所需要的。

答案 1 :(得分:0)

你可能不得不使用一个钩子,this article详细解释了如何做到这一点

答案 2 :(得分:0)

一种方法是模拟Console.ReadLine的行为,而实际上是分别读取和输出每个字符。当读取特殊序列(例如CTRL + A)时,可以拦截行为并插入字符。基本实现如下。

private static string EmulateReadLine()
{
    StringBuilder sb = new StringBuilder();
    int pos = 0;
    Action<int> SetPosition = (i) =>
        {
            i = Math.Max(0, Math.Min(sb.Length, i));
            pos = i;
            Console.CursorLeft = i;
        };
    Action<char, int> SetLastCharacter = (c, offset) =>
        {
            Console.CursorLeft = sb.Length + offset;
            Console.Write(c);
            Console.CursorLeft = pos;
        };
    ConsoleKeyInfo key;
    while ((key = Console.ReadKey(true)).Key != ConsoleKey.Enter)
    {
        int length = sb.Length;
        if (key.Key == ConsoleKey.LeftArrow)
        {
            SetPosition(pos - 1);
        }
        else if (key.Key == ConsoleKey.RightArrow)
        {
            SetPosition(pos + 1);
        }
        else if (key.Key == ConsoleKey.Backspace)
        {
            if (pos == 0) continue;
            sb.Remove(pos - 1, 1);
            SetPosition(pos - 1);
        }
        else if (key.Key == ConsoleKey.Delete)
        {
            if (pos == sb.Length) continue;
            sb.Remove(pos, 1);
        }
        else if (key.Key == ConsoleKey.Home)
            SetPosition(0);
        else if (key.Key == ConsoleKey.End)
            SetPosition(int.MaxValue);
        else if (key.Key == ConsoleKey.Escape)
        {
            SetPosition(0);
            sb.Clear();
        }
        // CUSTOM LOGIC FOR CTRL+A
        else if (key.Key == ConsoleKey.A &&
            (key.Modifiers & ConsoleModifiers.Control) != 0)
        {
            string stringtoinsert = "^";
            sb.Insert(pos, stringtoinsert);
            SetPosition(pos + stringtoinsert.Length);
        }
        else if (key.KeyChar != '\u0000') // keys that input text
        {
            sb.Insert(pos, key.KeyChar);
            SetPosition(pos + 1);
        }

        // replace entire line with value of current input string
        Console.CursorLeft = 0;
        Console.Write(sb.ToString());
        Console.Write(new string(' ', Math.Max(0, length - sb.Length)));
        Console.CursorLeft = pos;
    }

    Console.WriteLine();
    return sb.ToString();
}

开车:

static void Main(string[] args)
{
    string input = EmulateReadLine();
    Console.WriteLine("Entered {0}", input);
}

输入行时,按CTRL + A将插入“^”字符。箭头键,Escape,Home和End应该像Console.ReadLine一样正常工作。 (为了简化代码,自定义插入逻辑是硬连线的。)