2010-05-20 34 views
2

如何禁用備選 + ⇧Shift + ↹Tab使用c#?我已經禁用了Alt + ↹Tab使用一個只有兩個參數的函數。但要禁用三鍵鍵盤?如何使用c#禁用Alt + Shift + Tab?

我任何人都需要我的代碼來禁用兩個按鍵組合,我凸輪發布。但它相當大。

要禁用Alt鍵 + ↹Tab我這樣做,

RegisterGlobalHotKey(Keys.Tab, USE_ALT); 

如何通過三個參數[Alt鍵,Shift鍵,Tab]鍵?

public sealed class KeyboardHook : IDisposable 
{ 
    // Registers a hot key with Windows. 
    [DllImport("user32.dll")] 
    private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk); 
    // Unregisters the hot key with Windows. 
    [DllImport("user32.dll")] 
    private static extern bool UnregisterHotKey(IntPtr hWnd, int id); 

    /// <summary> 
    /// Represents the window that is used internally to get the messages. 
    /// </summary> 
    private class Window : NativeWindow, IDisposable 
    { 
     private static int WM_HOTKEY = 0x0312; 

     public Window() 
     { 
      // create the handle for the window. 
      try 
      { 
       this.CreateHandle(new CreateParams()); 
      } 
      catch (Exception ex) 
      { 
       ExceptionHandler.writeToLogFile(System.Environment.NewLine + "Target : " + ex.TargetSite.ToString() + System.Environment.NewLine + "Message : " + ex.Message.ToString() + System.Environment.NewLine + "Stack : " + ex.StackTrace.ToString()); 
      } 
     } 

     /// <summary> 
     /// Overridden to get the notifications. 
     /// </summary> 
     /// <param name="m"></param> 
     protected override void WndProc(ref Message m) 
     { 
      try 
      { 
       base.WndProc(ref m); 

       // check if we got a hot key pressed. 
       if (m.Msg == WM_HOTKEY) 
       { 
        // get the keys. 
        Keys key = (Keys)(((int)m.LParam >> 16) & 0xFFFF); 
        ModifierKeys modifier = (ModifierKeys)((int)m.LParam & 0xFFFF); 

        // invoke the event to notify the parent. 
        if (KeyPressed != null) 
         KeyPressed(this, new KeyPressedEventArgs(modifier, key)); 
       } 
      } 
      catch (Exception ex) 
      { 
       ExceptionHandler.writeToLogFile(System.Environment.NewLine + "Target : " + ex.TargetSite.ToString() + System.Environment.NewLine + "Message : " + ex.Message.ToString() + System.Environment.NewLine + "Stack : " + ex.StackTrace.ToString()); 
      } 
     } 

     public event EventHandler<KeyPressedEventArgs> KeyPressed; 

     #region IDisposable Members 

     public void Dispose() 
     { 
      this.DestroyHandle(); 
     } 

     #endregion 
    } 

    private Window _window = new Window(); 
    private int _currentId; 

    public KeyboardHook() 
    { 
     try 
     { 
      // register the event of the inner native window. 
      _window.KeyPressed += delegate(object sender, KeyPressedEventArgs args) 
      { 
       if (KeyPressed != null) 
        KeyPressed(this, args); 
      }; 
     } 
     catch (Exception ex) 
     { 
      ExceptionHandler.writeToLogFile(System.Environment.NewLine + "Target : " + ex.TargetSite.ToString() + System.Environment.NewLine + "Message : " + ex.Message.ToString() + System.Environment.NewLine + "Stack : " + ex.StackTrace.ToString()); 
     } 
    } 

    /// <summary> 
    /// Registers a hot key in the system. 
    /// </summary> 
    /// <param name="modifier">The modifiers that are associated with the hot key.</param> 
    /// <param name="key">The key itself that is associated with the hot key.</param> 
    public void RegisterHotKey(ModifierKeys modifier, Keys key) 
    { 
     try 
     { 
      // increment the counter. 
      _currentId = _currentId + 1; 

      // register the hot key. 
      if (!RegisterHotKey(_window.Handle, _currentId, (uint)modifier, (uint)key)) 
       throw new InvalidOperationException("Couldn’t register the hot key."); 
     } 
     catch (Exception ex) 
     { 
      ExceptionHandler.writeToLogFile(System.Environment.NewLine + "Target : " + ex.TargetSite.ToString() + System.Environment.NewLine + "Message : " + ex.Message.ToString() + System.Environment.NewLine + "Stack : " + ex.StackTrace.ToString()); 
     } 
    } 

    /// <summary> 
    /// A hot key has been pressed. 
    /// </summary> 
    public event EventHandler<KeyPressedEventArgs> KeyPressed; 

    #region IDisposable Members 

    public void Dispose() 
    { 
     // unregister all the registered hot keys. 
     for (int i = _currentId; i > 0; i--) 
     { 
      UnregisterHotKey(_window.Handle, i); 
     } 

     // dispose the inner native window. 
     _window.Dispose(); 
    } 

    #endregion 
} 

/// <summary> 
/// Event Args for the event that is fired after the hot key has been pressed. 
/// </summary> 
public class KeyPressedEventArgs : EventArgs 
{ 
    private ModifierKeys _modifier; 
    private Keys _key; 

    internal KeyPressedEventArgs(ModifierKeys modifier, Keys key) 
    { 
     _modifier = modifier; 
     _key = key; 
    } 

    public ModifierKeys Modifier 
    { 
      get { return _modifier; } 
     } 

     public Keys Key 
     { 
      get { return _key; } 
     } 
    } 

    /// <summary> 
    /// The enumeration of possible modifiers. 
    /// </summary> 
    [Flags] 
    public enum ModifierKeys : uint 
    { 
     Alt = 1, 
     Control = 2, 
     Shift = 4, 
     Win = 8 
    } 
+8

你爲什麼要? Win + Tab,Alt + Esc,Alt + Shift + Esc,Ctrl + Esc,Ctrl + Pause,Win + D,Win + M,...太? (記錄:我懷疑你想要一個自助服務終端應用程序,防止用戶做任何事情離開應用程序。)在這種情況下,我建議你不要給用戶一個鍵盤。 – Joey 2010-05-20 07:08:08

+1

這是一個很好的:) – Anuya 2010-05-20 07:13:05

+0

是這樣的: var TabShift = Keys.Tab | Keys.Shift; RegisterGlobalHotKey(TabShift,USE_ALT); – Anuya 2010-05-20 07:58:29

回答

2

你提到你使用的函數需要2個參數,但你沒有提到它是哪個函數。在任何情況下,Keys.ShiftKeys.Alt都是修飾鍵,所以無論您傳遞「Alt」到您的位置,都可能需要按位或按住「Shift」。

在WPF中,這將是這樣的:

var altShift = Keys.Alt | Keys.Shift; 
+0

找到上面的代碼,這對兩個參數工作正常。我想現在使用三個參數。 – Anuya 2010-05-20 07:29:10

+0

好吧,所以就像我說過的那樣...您當前傳遞ModifierKeys.Alt的位置,您將改爲傳遞ModifierKeys.Alt | ModifierKeys.Shift。 – Josh 2010-05-20 07:30:56

+0

試過,它劑量工作! – Anuya 2010-05-20 07:52:13