0

次のようにコンボボックスに入力します。

foreach (Keys key in Enum.GetValues(typeof(Keys)))
{
    comboKey.Items.Add(key);
}

後で、ユーザーは MIDI ノートとキーを選択できます。選択したノートが演奏されると、キーがシミュレートされます。で試してみましたSendKeys.Wait

public void NoteOn(NoteOnMessage msg) //Is fired when a MIDI note us catched 
    {
        AppendTextBox(msg.Note.ToString());
        if (chkActive.Checked == true)
        {
            if (comboKey != null && comboNote != null)
            {
                Note selectedNote = Note.A0;

                this.Invoke((MethodInvoker)delegate()
                {
                    selectedNote = (Note)comboNote.SelectedItem;
                });

                if (msg.Note == selectedNote)
                {
                    Keys selectedKey = Keys.A; //this is just so I can use the variable

                    this.Invoke((MethodInvoker)delegate()
                    {
                        selectedKey = (Keys)comboKey.SelectedItem;
                    });

                    SendKeys.SendWait(selectedKey.ToString());


                }
            }
        }
    }

しかし、たとえば、コンボボックスで「スペース」キーを選択して必要な音符を演奏すると、スペースが作成されず、単に「スペース」と書かれます。そして、これはおそらく私が書いたからだとわかってselectedKey.ToString()いますが、正しいアプローチは何ですか?

4

1 に答える 1

0

SendKeys(.SendWaitまたは)によって予期される入力.Sendは、押されているキーの名前と常に一致するとは限りません。このリンクで、すべての「特殊キー」のリストを見つけることができます。の名前を がcomboKey期待する形式に変換する方法を作成する必要がありますSendKeys。簡単で効果的な解決策は、Dictionary. サンプルコード:

Dictionary<string, string> dict = new Dictionary<string, string>();
dict.Add("a", "a");
dict.Add("backspace", "{BACKSPACE}"); 
dict.Add("break", "{BREAK}");
//replace the keys (e.g., "backspace" or "break") with the exact name (in lower caps) you are using in comboKey
//etc.

次のように変換する必要がありますSendKeys.SendWait(selectedKey.ToString());

SendKeys.SendWait(dict[selectedKey.ToString()]);
于 2013-09-19T14:23:26.430 に答える