wpf停止控制+;Alt+;del和windows按钮使用C#

wpf停止控制+;Alt+;del和windows按钮使用C#,c#,wpf,C#,Wpf,如何使用带wpf的C#禁用ctrl+Alt+del和windows按钮 我尝试使用一些事件,比如按键按下,但失败了。塔马斯·皮罗斯(Tamas Piros)就这个问题写了一篇很好的文章 也应该在WPF中工作不可能专门禁用Ctrl-Alt-Del的快捷键, 这是因为Ctrl-Alt-Del组合是一个深度烘焙的系统调用 但是,可以单独筛选这些快捷键,这样就可以使用这些键阻止其他快捷键。 要做到这一点,您需要连接到操作系统事件: 这将钩住系统事件 private delegate IntPtr Lo

如何使用带wpf的C#禁用ctrl+Alt+del和windows按钮


我尝试使用一些事件,比如按键按下,但失败了。

塔马斯·皮罗斯(Tamas Piros)就这个问题写了一篇很好的文章
也应该在WPF中工作

不可能专门禁用Ctrl-Alt-Del的快捷键, 这是因为Ctrl-Alt-Del组合是一个深度烘焙的系统调用

但是,可以单独筛选这些快捷键,这样就可以使用这些键阻止其他快捷键。 要做到这一点,您需要连接到操作系统事件:


这将钩住系统事件

private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int id, LowLevelKeyboardProc callback, IntPtr hMod, uint dwThreadId);
如果将id设置为13,它将挂接到键盘输入


在回调中,您需要做以下几件事:

[StructLayout(LayoutKind.Sequential)]
private struct KBDLLHOOKSTRUCT
{
    public readonly Keys key;
    private readonly int scanCode;
    private readonly int flags;
    private readonly int time;
    private readonly IntPtr extra;
}
读取c#中的实际键需要此结构

这可以通过给委托一个函数来使用,如:

private static IntPtr CaptureKey(int nCode, IntPtr wp, IntPtr lp)
{
    if (nCode < 0) return (IntPtr) 1; //CallNextHookEx(_ptrHook, nCode, wp, lp);
    KBDLLHOOKSTRUCT objKeyInfo = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lp, typeof(KBDLLHOOKSTRUCT));
    if(objKeyInfo.key == /*some key*/){
        // do something
    }
}
私有静态IntPtr CaptureKey(int nCode、IntPtr wp、IntPtr lp)
{
if(nCode<0)返回(IntPtr)1;//CallNextHookEx(_ptrHook,nCode,wp,lp);
KBDLLHOOKSTRUCT objKeyInfo=(KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lp,typeof(KBDLLHOOKSTRUCT));
if(objKeyInfo.key==/*某个key*/){
//做点什么
}
}
使用此功能时,您可以从
objKeyInfo.key

有关
Ctrl
-
Alt
-
Del
组合的更多背景信息:

基本摘要:“您的程序本身无法禁用它,但您可以从程序内部设置一些注册表值,以更改组策略规则,从而禁用从Ctrl+Alt+Del启动任务管理器”。