8

現在、必要なキー押下を検出できるプログラムのキー押下の組み合わせを実装してみてください (この記事では方法を説明しています) が、コードで事前に定義されているだけですが、設定を condig ファイルに保存してから、それを読み取り、押下された場合に使用したいと考えています。

それを保存し、文字列として読み取ることができるようになりました - 現在Keys、次のコードを使用して、読み取った文字列を に変換しようとしています:

設定ファイルへの保存:

<add key="open" value="ControlKey,N"
<add key="close" value="ControlKey,Q" />
<add key="clear" value="ControlKey,D" />
<add key="settings" value="ControlKey,S" />
<add key="colorKey" value="ControlKey,K" />
<add key="fontKey" value="ShiftKey,T" />
<add key="defaultKey" value="ControlKey,P" />

そしてそれを使用して

    private void textBox1_KeyDown(object sender, KeyEventArgs e)
    {
        TypeConverter converter = TypeDescriptor.GetConverter(typeof(Keys));
        string[] keyValueTemp;

        keyValueTemp = cm.GetValueString("open").ToString().Split(',');
        string key1 = keyValueTemp[0];
        string key2 = keyValueTemp[1];

        Keys keys1 = (Keys)converter.ConvertFromString(key1);
        Keys keys2 = (Keys)converter.ConvertFromString(key2);

        if (ModifierKeys == keys1 && e.KeyCode == keys2)
        {
            string keyPressed = e.KeyCode.ToString();
            MessageBox.Show(keyPressed);
        }
    }

しかし、次の結果があります -

ここに画像の説明を入力 ご覧のとおり、これはコントロールのキーをシフトキーに変換し、コードを使用しようとしますif (ModifierKeys.ToString() == keyValueTemp[0] && e.KeyCode.ToString() == keyValueTemp[1])が、それも機能しません。

このコードを使用する場合

        if (e.Modifiers == Keys.Control && e.KeyCode == Keys.N)
        {
            string keyPressed = e.KeyCode.ToString();
            MessageBox.Show(keyPressed);
        }

すべての作品

Q: 文字列をキーに変換して keyPressed イベントと比較するにはどうすればよいですか?

編集

だから私の間違いを見つけた

Keys key = (Keys)converter.ConvertFromString(keyValueTemp[0]);
Keys key2 = (Keys)converter.ConvertFromString(keyValueTemp[1]);
if (e.Modifiers == key && e.KeyCode == key2)
   {
       MessageBox.Show(e.KeyCode.ToString());
   }

追加するのを忘れたe- イベントハンドラから

別の方法 - AccessDeniedによって書かれたように

 Keys key = (Keys)Enum.Parse(typeof(Keys), keyValueTemp[0], true);
4

5 に答える 5

8
Keys key;
Enum.TryParse("Enter", out key);
于 2013-09-29T12:09:06.520 に答える
7

キーの比較は列挙型で行われるため、String to Enum変換を行う必要があります。

if (e.Modifiers == (Keys)Enum.Parse(typeof(Keys), "keys1", true)
    && e.KeyCode == (Keys)Enum.Parse(typeof(Keys), "keys2", true))
{
    string keyPressed = e.KeyCode.ToString();
    MessageBox.Show(keyPressed);
}
于 2013-09-29T12:08:32.370 に答える
3

キーを「ControlKey、N」として構成に保存しないで、その値を保存することをお勧めします。

 Keys openKey = Keys.ControlKey | Keys.N;
 int value = (int)openKey;//95

整数表現な95ので、app.configに次のように保存します

<add key="open" value="95">//ControlKey|N

Keys open = (Keys)int.Parse(cm.GetValueString("open").ToString());

ここで開くKeys.ControlKey | Keys.N

次に、簡単に比較できますe.KeyData

if(e.KeyData == open)
{
    //Control + N pressed
}
于 2013-09-29T12:23:47.137 に答える
0

私は次の方法でそれをやっています。app.config ファイルには次のものがあります

<add key="KeyboardShortcut" value="Control+M" />

そしてそれを私のコードファイルで使用する

public System.Windows.Forms.Keys ShortCutKeys
{
    get
    {
        string keyboardShortcut = ConfigurationManager.AppSettings["KeyboardShortcut"];
        System.Windows.Forms.Keys retval = System.Windows.Forms.Keys.None;

        if (!string.IsNullOrEmpty(keyboardShortcut))
        {
            try
            {
                 System.Windows.Forms.KeysConverter kc = new System.Windows.Forms.KeysConverter();
                 retval = (System.Windows.Forms.Keys)kc.ConvertFromInvariantString(keyboardShortcut);
            }
            catch (Exception ex)
            {
                log.Info(ex.ToString());           
            }
       }
       return retval;
    }
}

キーが押されたかどうかを検出する

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    try
    {           
        if (this.ShortCutKeys != Keys.None && (keyData & this.ShortCutKey) == this.ShortCutKey)
        {
            this.Execute_Plugin();
        }
    }
    catch(Exception ex)
    {
        log.Error(ex.ToString());
    }
}
于 2016-12-19T10:53:39.993 に答える