C# String zum Key

05/04/2010 19:25 gokay22#1
Hallo liebe User,
Ich habe seit langer Zeit ein Problem das mich ne Weile beschäftigt.
Es geht um Hotkeys und Strings..

Was ich machen will:

Ich habe jetzt diesen Code:


Code:
        UserActivityHook lisa = new UserActivityHook(false, true);
        Keys[] hotkeys;

        public MainForm()
        {
            InitializeComponent();

            hotkeys = new Keys[80];
            lisa.KeyDown += new KeyEventHandler(lisa_KeyDown);
        }



        private void LadenButton_Click(object sender, EventArgs e)
        {

            XmlDocument configdoc = new XmlDocument();
            configdoc.Load("Config.xml");

            XmlNode hottaste = configdoc.SelectSingleNode("/BindConfig/Hotkey0");
            hotkeys[0] = Keys.None; //Hier soll der Convert von String zum Key stattfinden
        }


        private void SpeichernButton_Click_1(object sender, EventArgs e)
        {

            XmlTextWriter keybinderconfig = new XmlTextWriter("Config.xml", System.Text.Encoding.UTF8);
            keybinderconfig.Formatting = Formatting.Indented;
            keybinderconfig.WriteStartDocument(false);

            keybinderconfig.WriteStartElement("BindConfig");
            keybinderconfig.WriteElementString("HotKey0", hotkeys[0].ToString());
       }
Was ich versucht habe beim Laden war:

hotkeys[0] = hottaste.InnerText; //wobei hier nur der String geladen wird und zu einem error kommt. Ich will jedoch das er den String in den Key konvertiert


Danke im Vorraus...
05/05/2010 09:36 x]vIrus[x#2
das selbe problem hatte ich auch schonmal, ich habe mir dann nen kleinen parser geschrieben:

Code:
        public static Shortcut parseShortcut(string name)
        {
            int c = 0;
            try
            {
                c = int.Parse(name);
                return (Shortcut)c;
            }

            catch (Exception) { }
            name = name.Replace("Ctrl", "Control");
            name = name.Replace("Bkspc", "Back");

            string[] parts = name.Split('+');

            for (int i = 0; i < parts.Length; i++)
            {
                parts[i] = Regex.Replace(parts[i], "[0-9]", "D" + parts[i]);
                c += (int)Enum.Parse(typeof(Keys), parts[i]);
            }

            return (Shortcut)c;
        }
input muss z.b. so aussehen:
parseShortcut("Control+Alt+B");
oder parseShortcut("Alt+F4");

^^
05/05/2010 10:43 x]vIrus[x#3
ein hotkey is ein Shortcut

und hier das umgekehrte:
Code:
        public static string getShortcutName(Shortcut shortcut)
        {
            Array a = Enum.GetValues(typeof(Keys));
            string s = "";

            for (int i = a.Length; i > 0; i--)
            {
                Keys k = (Keys)a.GetValue(i - 1);
                if (((uint)k & (uint)shortcut) == (uint)k)
                {
                    string key = k.ToString();

                    if (shortcut == 0)
                    {
                        i = 0;
                        if (s.EndsWith("+")) s = s.Substring(0, s.Length - 1);
                        else if (s.Length == 0) s = "None";
                    }
                    else
                    {
                        key = Regex.Replace(key, "D[0-9]", Regex.Match(key, "D([0-9])").Groups[1].ToString());
                        s += key + "+";
                    }
                    shortcut = (Shortcut)((uint)shortcut - (uint)k);
                }
            }

            return s;
        }
05/05/2010 14:01 gokay22#4
Du meinst ich kann dann einfach so das übernehmen: ?
hotkeys[0] = parseShortcut(hottaste.InnerText);
05/05/2010 14:45 x]vIrus[x#5
solange es kein shortcut sein soll kannst du auch einfach
Code:
hotkeys[0] = (Keys)Enum.Parse(typeof(Keys), hottaste.InnerText);
nehmen

;) mfg
05/05/2010 16:14 gokay22#6
Kriege folgenden Error nach dem LadeButton drücken:
Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
05/05/2010 16:18 x]vIrus[x#7
solche fehler solltest du selbst lösen können ;) check ma ob hottaste.innertext null is oder net, ich bin grad net dahaim, deshalb kann ich nicht wirklich testen/debuggen, aber beim debuggen müsstest du herausfinden können was falsch ist,...

mfg
05/05/2010 23:36 gokay22#8
Klappt perfekt :)
Danke dir nochmal ^^ Hast für jeden Post ein Thanks bekommen ;)