2012-02-23 76 views
2

我想要做的是实现一个TextBox,它接受一个组合键作为输入。例如,文本Win + Ctrl + A在按下这些键时出现(Windows窗体或WPF)。实现快捷方式编辑器TextBox的最佳方式是什么?

一个很好的例子是在Winamp设置下的“Global Hotkeys”下。

+0

@DJKRAZE我想他想让文本框向他展示被按下的内容。不发送印刷机。 – DaveShaw 2012-02-23 17:44:32

+0

@DaveShaw准确 – Tibi 2012-02-23 17:49:47

+0

他可以做到这一点以及通过捕获按键,如果有按键的3个组合键他按代码得到在if(e.KeyCode == Keys.Enter && Key.CTRL && key.H)for例如在KeyDownEvent上做这件事..这应该有助于你开始..如果(e.KeyCode == Win + Crl + A)追加密钥。对于Win,Ctrl,A – MethodMan 2012-02-23 17:50:22

回答

3

这是你如何可以检测几乎是被完全按下的键: 来源:How to detect the currently pressed key?

private KeyMessageFilter m_filter = new KeyMessageFilter(); 

private void Form1_Load(object sender, EventArgs e) 
{ 
    Application.AddMessageFilter(m_filter); 

} 


public class KeyMessageFilter : IMessageFilter 
{ 
    private Dictionary<Keys, bool> m_keyTable = new Dictionary<Keys, bool>(); 

    public Dictionary<Keys, bool> KeyTable 
    { 
     get { return m_keyTable; } 
     private set { m_keyTable = value; } 
    } 

    public bool IsKeyPressed() 
    { 
     return m_keyPressed; 
    } 

    public bool IsKeyPressed(Keys k) 
    { 
     bool pressed = false; 

     if (KeyTable.TryGetValue(k, out pressed)) 
     { 
      return pressed;     
     } 

     return false; 
    } 

    private const int WM_KEYDOWN = 0x0100; 

    private const int WM_KEYUP = 0x0101; 

    private bool m_keyPressed = false; 


    public bool PreFilterMessage(ref Message m) 
    { 
     if (m.Msg == WM_KEYDOWN) 
     { 
      KeyTable[(Keys)m.WParam] = true; 

      m_keyPressed = true; 
     } 

     if (m.Msg == WM_KEYUP) 
     {     
      KeyTable[(Keys)m.WParam] = false; 

      m_keyPressed = false; 
     } 

     return false; 
    } 
} 
+0

有趣的是,我可能会试试这个。 – Tibi 2012-02-23 17:53:39

0

检查了这一点:

private void textBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    HotKeyCls h = new HotKeyCls() { Ctrl = e.Control, Alt = e.Alt, Shift = e.Shift, Key = e.KeyCode }; 
    textBox1.Text = h.ToString(); 
} 

HotKeyCls:

//Coded by Amen Ayach's DataClassBuilder @23/02/2012 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

public class HotKeyCls{ 

    private bool _Ctrl; 
    public bool Ctrl{ 
     get { 
      return _Ctrl; 
     } 
     set { 
      _Ctrl = value; 
     } 
    } 

    private bool _Shift; 
    public bool Shift{ 
     get { 
      return _Shift; 
     } 
     set { 
      _Shift = value; 
     } 
    } 

    private bool _Alt; 
    public bool Alt{ 
     get { 
      return _Alt; 
     } 
     set { 
      _Alt = value; 
     } 
    } 

    private System.Windows.Forms.Keys _Key; 
    public System.Windows.Forms.Keys Key 
    { 
     get { 
      return _Key; 
     } 
     set { 
      _Key = value; 
     } 
    } 

    public override string ToString() 
    { 
     return (Ctrl ? "Ctrl+" : "") + (Shift ? "Shift+" : "") + (Alt ? "Alt+" : "") + Key.ToString();   
    } 
} 
相关问题