2012-12-08 76 views
3

我想要完成的是將ConsoleKey分配給變量,然後使用ConsoleKeyInfo來修改變量。我收到錯誤說Cannot convert source type 'System.ConsoleKey' to target type 'System.ConsoleKeyInfo'C# - 分配ConsoleKey,然後使用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」開始? ; ^)

這是一個奇怪的,詳細的構造函數,但做你看起來要問。

+0

工程太棒了!謝謝! 比從未更好的遲到。 –

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)); 
      } 
     } 
    } 
} 
+1

感謝您的迴應邁克爾。對於我希望完成的事情來說,這似乎有點複雜。如果可能,我還希望在應用程序內完成轉換,而不是創建外部文件。 –