2014-11-24 62 views
1

msdn文档,在的WinForms我可以检查是否修改键(SHIFTCTRL,并ALT)处于按下状态,鼠标在事件。例如:检查过程中的鼠标事件非组合键在按下状态

private void button1_Click(object sender, System.EventArgs e) 
{ 
    /* If the CTRL key is pressed when the 
    * control is clicked, hide the control. */ 
    if(Control.ModifierKeys == Keys.Control) 
    { 
    ((Control)sender).Hide(); 
    } 
} 

我如何检查是否非修饰键,如空间处于按下状态,例如鼠标移动事件中?

+0

可能重复的[如何让IsKeyDown方法在C#中工作](http://stackoverflow.com/questions/12984522/how-to-get-iskeydown-method-to-work-in-c-sharp) – Dennis 2014-11-24 06:26:50

+0

另外:http://stackoverflow.com/questions/1100285/how-to-detect-the-currently-pressed-key – Dennis 2014-11-24 06:29:32

回答

-1

您有几种选择:

选项1:添加自定义邮件过滤器到应用程序:

private KeyMessageFilter _filter = new KeyMessageFilter(); 

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

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

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

    public bool IsKeyPressed() 
    { 
     return _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 _keyPressed = false; 


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

      _keyPressed = true; 
     } 

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

      _keyPressed = false; 
     } 

     return false;   
} 

选项2

:使用函数GetKeyState API功能之前链接。
using System; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

namespace MouseKeyboardStateTest 
{ 
    public abstract class Keyboard 
    { 
    [Flags] 
    private enum KeyStates 
    { 
     None = 0, 
     Down = 1, 
     Toggled = 2 
    } 

    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] 
    private static extern short GetKeyState(int keyCode); 

    private static KeyStates GetKeyState(Keys key) 
    { 
     KeyStates state = KeyStates.None; 

     short retVal = GetKeyState((int)key); 

     //If the high-order bit is 1, the key is down 
     //otherwise, it is up. 
     if ((retVal & 0x8000) == 0x8000) 
     state |= KeyStates.Down; 

     //If the low-order bit is 1, the key is toggled. 
     if ((retVal & 1) == 1) 
     state |= KeyStates.Toggled; 

     return state; 
    } 

    public static bool IsKeyDown(Keys key) 
    { 
     return KeyStates.Down == (GetKeyState(key) & KeyStates.Down); 
    } 

    public static bool IsKeyToggled(Keys key) 
    { 
     return KeyStates.Toggled == (GetKeyState(key) & KeyStates.Toggled); 
    } 
    } 
} 

选项3: 自己处理KeyDown和KeyUp事件。这不是最好的方法,但对于小型应用程序会很好。

+0

最好将问题标记为重复,提供已经回答问题的链接,而不是复制/粘贴来自该问题的答案,并将其作为自己的答案传递:http://stackoverflow.com/a/1927644/580053 – Dennis 2014-11-24 06:25:41