我要完成的是将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
这可能很简单,但似乎是在逃避我。
答案 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));
}
}
}
}