处理击键:了解IntPtr返回值

时间:2012-02-11 07:56:29

标签: c# wpf

与普通方法相比,我试图理解阻止键盘上某些键的代码并只允许一些退出路径。

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

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符号为&分配WinForms.Control.ModifierKeys & Keys.Alt值是什么意思?{/ 1}}

我们已经处理了击键,但关于返回IntPtr 1的重点是什么?

2 个答案:

答案 0 :(得分:2)

Keys.Alt枚举值是一个位掩码,其位设置确定是否按下 Alt 修饰键。

&运算符按位执行,当在两个intEnum值上使用时,WinForms.Control.ModifierKeys上的运算符会为选择一个位Alt 键。

该方法返回IntPtr值,因此要返回指定已处理密钥的值1,您必须将其强制转换为IntPtr

答案 1 :(得分:0)

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