如何使用c#禁用Alt + Shift + Tab?

问题描述:

如何禁用备选 + ⇧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个参数,但你没有提到它是哪个函数。在任何情况下,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