C# - 分配ConsoleKey,然后使用ConsoleKeyInfo重新分配

时间:2012-12-08 11:01:47

标签: c#

我要完成的是将ConsoleKey分配给变量,然后使用ConsoleKeyInfo修改变量。

我收到错误Cannot convert source type 'System.ConsoleKey' to target type 'System.ConsoleKeyInfo'

这背后的原因是我希望用户能够重新编程应用程序中使用的密钥。

到目前为止,我有这个;

public static ConsoleKeyInfo keyboardkeynorth;
keyboardkeynorth = Console.ReadKey();

这样做有效,但它不允许我在keyboardkeynorth已设置为ConsoleKey.W的情况下启动该计划。

在该计划的其他地方,我会将keyboardkeynorth称为ConsoleKey

这可能很简单,但似乎是在逃避我。

2 个答案:

答案 0 :(得分:2)

在你提出要求之后3年多来意识到这一点......

public static ConsoleKeyInfo keyboardkeynorth = 
    new ConsoleKeyInfo('W', ConsoleKey.W, false, false, false);

你最初不希望“北方”成为“N”吗? ; ^)

这是一个奇怪的,冗长的构造函数,但你做的似乎是在做什么。

答案 1 :(得分:0)

这是一个完整而简单的程序,向您展示如何执行此操作。我说的很简单,因为它没有考虑CTRL,ALT或SHIFT - 并且基于我如何收集自定义密钥信息,你甚至无法设置它们,因为我正在使用ReadKey。但你会明白的。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Reflection;

namespace ConsoleApplication23
{
    class Program
    {
        private static ConsoleKeyInfo keyAction1, keyAction2, keyAction3;

        static void Main(string[] args)
        {
            InitializeKeyActions();

            Console.Write("Do you want a new key action for #1? ");
            var result = Console.ReadKey();
            if (result.Key != ConsoleKey.Enter) { UpdateKeyInfo("keyAction1", result); }
        }

        private static void UpdateKeyInfo(string keyName, ConsoleKeyInfo result)
        {
            var propertyInfo = typeof(Program).GetField(keyName, BindingFlags.NonPublic | BindingFlags.Static);
            if (propertyInfo == null) { return; }

            var key = result.KeyChar;
            propertyInfo.SetValue(null, new ConsoleKeyInfo(key, (ConsoleKey)key, false, false, false));

            StringBuilder keyActions = new StringBuilder();

            foreach (var line in File.ReadAllLines("keyactions.ini"))
            {
                var kvp = line.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
                if (kvp[0] != keyName)
                {
                    keyActions.AppendLine(line);
                    continue;
                }

                keyActions.AppendLine(string.Format("{0}: {1}", kvp[0], result.KeyChar));
            }

            File.WriteAllText("keyactions.ini", keyActions.ToString());
        }

        private static void InitializeKeyActions()
        {
            if (!File.Exists("keyactions.ini"))
            {
                StringBuilder keyActions = new StringBuilder();
                keyActions.AppendLine("keyAction1: A");
                keyActions.AppendLine("keyAction2: B");
                keyActions.AppendLine("keyAction3: C");

                File.WriteAllText("keyactions.ini", keyActions.ToString());
            }

            foreach (var line in File.ReadAllLines("keyactions.ini"))
            {
                var kvp = line.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);

                var propertyInfo = typeof(Program).GetField(kvp[0], BindingFlags.NonPublic | BindingFlags.Static);
                if (propertyInfo == null) { continue; }

                var key = kvp[1].Trim()[0];
                propertyInfo.SetValue(null, new ConsoleKeyInfo(key, (ConsoleKey)key, false, false, false));
            }
        }
    }
}