处理的击键:了解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
有什么意义呢?
Keys.Alt
枚举值是一个位掩码,它具有确定是否按下Alt+kbd>修饰符键的位集。
当用于两个int
或Enum
值时,&
运算符执行逐位操作,因此在WinForms.Control.ModifierKeys
上执行此操作会为Alt键挑出位。
该方法返回一个IntPtr
值,因此要返回指定已处理密钥的值1
,必须将其强制转换为IntPtr
。
&
符号用于对两个参数执行逐位and
。在这种情况下,WinForms.Control.ModifierKeys & Keys.Alt
正在检查是否按下了Alt
键。