3

我想要完成的是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

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

4

2 回答 2

2

在您询问之后意识到这是短短的 3 年多...

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

你不希望“北”最初是“N”吗?;^)

这是一个奇怪的、冗长的构造函数,但可以满足您的要求。

于 2016-02-23T23:20:58.030 回答
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));
            }
        }
    }
}
于 2012-12-08T12:21:56.677 回答