处理的击键:了解IntPtr返回值

本文关键字:了解 IntPtr 返回值 处理 | 更新日期: 2023-09-27 18:24:01

与普通方法相比,我正在尝试理解一个代码,该代码会阻止键盘上的一些键,并且只允许一些退出路径。

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

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);
      }

在这行WinForms.Control.ModifierKeys & Keys.Alt中,用&符号将boolean值分配给Alt意味着什么?

我们已经处理了按键,但是返回1的IntPtr有什么意义呢?

处理的击键:了解IntPtr返回值

Keys.Alt枚举值是一个位掩码,它具有确定是否按下Alt+kbd>修饰符键的位集。

当用于两个intEnum值时,&运算符执行逐位操作,因此在WinForms.Control.ModifierKeys上执行此操作会为Alt键挑出位。

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

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