2014-11-24 34 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

相關問題