与普通方法相比,我试图理解阻止键盘上某些键的代码并只允许一些退出路径。
我已经能够获得大部分内容,但是这部分我们实际上正在处理这个函数中的击键。 这是代码:
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的重点是什么?
答案 0 :(得分:2)
Keys.Alt
枚举值是一个位掩码,其位设置确定是否按下 Alt 修饰键。
&
运算符按位执行,当在两个int
或Enum
值上使用时,WinForms.Control.ModifierKeys
上的运算符会为选择一个位Alt 键。
该方法返回IntPtr
值,因此要返回指定已处理密钥的值1
,您必须将其强制转换为IntPtr
。
答案 1 :(得分:0)
&
符号用于对两个参数执行按位and
。在这种情况下,WinForms.Control.ModifierKeys & Keys.Alt
正在检查是否已按下Alt
键。