2012-02-11 97 views
0

我想了解一个代码,它阻止了键盘上的一些键,并且只允许一些退出路径,与普通方法相比。击键处理:理解IntPtr返回值

我已经能够获得它的大部分,但是这个部分我们实际上是在处理这个函数中的击键。 下面的代码:

public static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) 
     { 
     if (nCode >= 0) 
     { 
      bool Alt = (WinForms.Control.ModifierKeys & Keys.Alt) != 0; 
      bool Control = (WinForms.Control.ModifierKeys & Keys.Control) != 0; 

      //Prevent ALT-TAB and CTRL-ESC by eating TAB and ESC. Also kill Windows Keys. 
      int vkCode = Marshal.ReadInt32(lParam); 
      Keys key = (Keys)vkCode; 

      if (Alt && key == Keys.F4) 
      { 
       Application.Current.Shutdown(); 
       return (IntPtr)1; //handled 
      } 
      if (key == Keys.LWin ||key == Keys.RWin) return (IntPtr)1; //handled 
      if (Alt && key == Keys.Tab) return (IntPtr)1; //handled 
      if (Alt && key == Keys.Space) return (IntPtr)1; //handled 
      if (Control && key == Keys.Escape)return (IntPtr)1; 
      if (key == Keys.None) return (IntPtr)1; //handled 
      if (key <= Keys.Back) return (IntPtr)1; //handled 
      if (key == Keys.Menu) return (IntPtr)1; //handled 
      if (key == Keys.Pause) return (IntPtr)1; //handled 
      if (key == Keys.Help) return (IntPtr)1; //handled 
      if (key == Keys.Sleep) return (IntPtr)1; //handled 
      if (key == Keys.Apps) return (IntPtr)1; //handled 
      if (key >= Keys.KanaMode && key <= Keys.HanjaMode) return (IntPtr)1; //handled 
      if (key >= Keys.IMEConvert && key <= Keys.IMEModeChange) return (IntPtr)1; //handled 
      if (key >= Keys.BrowserBack && key <= Keys.BrowserHome) return (IntPtr)1; //handled 
      if (key >= Keys.MediaNextTrack && key <= Keys.OemClear) return (IntPtr)1; //handled 

      Debug.WriteLine(vkCode.ToString() + " " + key); 


     } 
     return InterceptKeys.CallNextHookEx(_hookID, nCode, wParam, lParam); 
     } 

是什么赋予boolean值与&符号为Alt这一行WinForms.Control.ModifierKeys & Keys.Alt是什么意思?

我们已经处理了按键,但是关于返回1的IntPtr是什么意思?

回答

2

Keys.Alt枚举值是一个位掩码,其具有位组确定是否Alt键修饰键被按下。

&符不按位和两个intEnum值时,这样做是对WinForms.Control.ModifierKeys单打出位的Alt键关键。

该方法返回一个IntPtr值,因此要返回值1指定该密钥已处理,则必须将其转换为IntPtr

+0

我早先在我的一个应用程序中使用了e.KeyChar == Keys.Alt在Keypress事件中。这有什么区别吗? – Cipher 2012-02-11 08:17:16

+0

@Cipher:这是一种不同的用法,因为当按下Alt键时你会捕捉到,而'ModifierKeys'属性包含当前按下的修饰键。 – Guffa 2012-02-11 12:14:44

0

&符号用于对两个参数执行按位and。在这种情况下,WinForms.Control.ModifierKeys & Keys.Alt正在检查是否已按下Alt键。