c# 屏蔽快捷键的实现示例

 更新时间:2021年03月11日 09:35:53   作者:leestar54  
这篇文章主要介绍了c# 屏蔽快捷键的实现示例,帮助大家更好的理解和利用c#进行桌面开发,感兴趣的朋友可以了解下

前言

有时候开发会遇到这样一个需求,软件需要屏蔽用户的组合快捷键或某些按键,避免强制退出软件,防止勿操作等。

原理

1、要实现组合键,按键拦截,需要用到user32.dll中的SetWindowsHookEx。

2、要拦截ctrl+alt+del,需要使用ntdll.dll的ZwSuspendProcess函数挂起winlogon程序,退出之后使用ZwResumeProcess恢复winlogon程序。

3、软件需要开启topMost,以及全屏,否则离开软件则拦截无效。

4、如果要实现热键监听(非焦点拦截),则需要用到user32.dll的RegisterHotKey以及UnregisterHotKey。

实现

1、Program类

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace LockForm
{
 static class Program
 {
  /// <summary>
  /// 应用程序的主入口点。
  /// </summary>
  [STAThread]
  static void Main()
  {
   Application.EnableVisualStyles();
   Application.SetCompatibleTextRenderingDefault(false);
   SuspendWinLogon();
   Application.Run(new Form1());
   ResumeWinLogon();
  }

  [DllImport("ntdll.dll")]
  public static extern int ZwSuspendProcess(IntPtr ProcessId);
  [DllImport("ntdll.dll")]
  public static extern int ZwResumeProcess(IntPtr ProcessId);

  private static void SuspendWinLogon()
  {
   Process[] pc = Process.GetProcessesByName("winlogon");
   if (pc.Length > 0)
   {
    ZwSuspendProcess(pc[0].Handle);
   }
  }

  private static void ResumeWinLogon()
  {
   Process[] pc = Process.GetProcessesByName("winlogon");
   if (pc.Length > 0)
   {
    ZwResumeProcess(pc[0].Handle);
   }
  }
 }
}

2、Form1类

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;

namespace LockForm
{
 public partial class Form1 : Form
 {
  public Form1()
  {
   InitializeComponent();
  }

  private void button1_Click(object sender, EventArgs e)
  {
   if (textBox1.Text == "123")
   {
    Application.ExitThread();
   }
   else
   {
    webBrowser1.Navigate(textBox1.Text);
   }
  }

  private void Form1_Load(object sender, EventArgs e)
  {
   //webBrowser1.Navigate("https://baidu.com");
   HookStart();
   //this.TopMost = false;
   //SuspendWinLogon();
  }

  private void webBrowser1_NewWindow(object sender, CancelEventArgs e)
  {
   e.Cancel = true;
   webBrowser1.Navigate(webBrowser1.Document.ActiveElement.GetAttribute("href"));
  }

  private void button3_Click(object sender, EventArgs e)
  {
   webBrowser1.GoBack();
  }

  private void button2_Click(object sender, EventArgs e)
  {
   webBrowser1.GoForward();
  }

  private void button4_Click(object sender, EventArgs e)
  {
   webBrowser1.GoHome();
  }

  private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e)
  {
   textBox1.Text = webBrowser1.Url.ToString();
  }

  private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
  {

  }

  #region 键盘钩子

  public delegate int HookProc(int nCode, int wParam, IntPtr lParam);//定义全局钩子过程委托,以防被回收(钩子函数原型)
  HookProc KeyBoardProcedure;

  //定义键盘钩子的相关内容,用于截获键盘消息
  static int hHook = 0;//钩子函数的句柄
  public const int WH_KEYBOARD = 13;
  //钩子结构函数
  public struct KeyBoardHookStruct
  {
   public int vkCode;
   public int scanCode;
   public int flags;
   public int time;
   public int dwExtraInfo;

  }
  //安装键盘钩子
  public void HookStart()
  {

   if (hHook == 0)
   {
    //实例化一个HookProc对象
    KeyBoardProcedure = new HookProc(Form1.KeyBoardHookProc);

    //创建线程钩子
    hHook = Win32API.SetWindowsHookEx(WH_KEYBOARD, KeyBoardProcedure, Win32API.GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);

    //如果设置线程钩子失败
    if (hHook == 0)
    {
     HookClear();
    }
   }
  }

  //取消钩子
  public void HookClear()
  {
   bool rsetKeyboard = true;
   if (hHook != 0)
   {
    rsetKeyboard = Win32API.UnhookWindowsHookEx(hHook);
    hHook = 0;
   }
   if (!rsetKeyboard)
   {
    throw new Exception("取消钩子失败!");
   }
  }
  //对截获的键盘操作的处理
  public static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)
  {
   if (nCode >= 0)
   {
    KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));

    if (kbh.vkCode == 91)//截获左边WIN键
    {
     return 1;
    }
    if (kbh.vkCode == 92)//截获右边WIN键
    {
     return 1;
    }
    if (kbh.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Control)//截获Ctrl+ESC键
    {
     return 1;
    }
    if (kbh.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Alt)
    {
     return 1;
    }
    if (kbh.vkCode == (int)Keys.F4 && (int)Control.ModifierKeys == (int)Keys.Alt)//截获ALT+F4
    {
     return 1;
    }
    if (kbh.vkCode == (int)Keys.Tab && (int)Control.ModifierKeys == (int)Keys.Alt)//截获ALT+TAB
    {
     return 1;
    }
    if (kbh.vkCode == (int)Keys.Delete&&(int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt)
    {
     return 1;
    }
    if ( kbh.vkCode == (int) Keys.Escape && (int) Control.ModifierKeys == (int) Keys.Control + (int) Keys.Alt ) /* 截获Ctrl+Shift+Esc */
    {
     return 1;
    }

   }

   return Win32API.CallNextHookEx(hHook, nCode, wParam, lParam);
  }
  #endregion
 }
}

3、声明windows api

//设置钩子
  [DllImport("user32.dll")]
  public static extern int SetWindowsHookEx(int idHook, LockForm.Form1.HookProc lpfn, IntPtr hInstance, int threadID);

  //卸载钩子
  [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]
  public static extern bool UnhookWindowsHookEx(int idHook);

  //调用下一个钩子
  [DllImport("user32.dll")]
  public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);

PS:

windows api查询

http://www.pinvoke.net/index.aspx

demo下载

链接:http://pan.baidu.com/s/1jGpOvsE 密码:dbj2

以上就是c# 屏蔽快捷键的实现示例的详细内容,更多关于c# 屏蔽快捷键的资料请关注脚本之家其它相关文章!

相关文章

  • C#解析char型指针所指向的内容(实例解析)

    C#解析char型指针所指向的内容(实例解析)

    在c++代码中定义了一个功能函数,这个功能函数会将计算的结果写入一个字符串型的数组中output,然后c#会调用c++导出的dll中的接口函数,然后获取这个output并解析成string类型,本文通过实例解析C# char型指针所指向的内容,感兴趣的朋友一起看看吧
    2024-03-03
  • C# 利用ICSharpCode.SharpZipLib实现在线压缩和解压缩

    C# 利用ICSharpCode.SharpZipLib实现在线压缩和解压缩

    本文主要主要介绍了利用ICSharpCode.SharpZipLib第三方的DLL库实现在线压缩和解压缩的功能,并做了相关的代码演示。
    2016-04-04
  • C#字符串的常用操作工具类代码分享

    C#字符串的常用操作工具类代码分享

    这篇文章主要介绍了C#字符串的常用操作工具类代码分享,需要的朋友可以参考下
    2014-04-04
  • .NET的深复制方法(以C#语言为例)

    .NET的深复制方法(以C#语言为例)

    深复制需要将对象实例中字段引用的对象也进行复制,在平时的编程工作中经常要用到这种复制方式,下面以c#为例来演示一下方法。
    2016-10-10
  • C# 实现ADSL自动断网和拨号的方法(适用于拨号用户)

    C# 实现ADSL自动断网和拨号的方法(适用于拨号用户)

    下面小编就为大家带来一篇C# 实现ADSL自动断网和拨号的方法(适用于拨号用户)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • c#之OpenFileDialog解读(打开文件对话框)

    c#之OpenFileDialog解读(打开文件对话框)

    这篇文章主要介绍了c#之OpenFileDialog(打开文件对话框),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • 浅谈C#六大设计原则

    浅谈C#六大设计原则

    这篇文章主要介绍了C#六大设计原则的相关内容,文中代码非常细致,供大家参考和学习,感兴趣的朋友可以了解下
    2020-06-06
  • C#校验时间格式的场景分析

    C#校验时间格式的场景分析

    本文通过场景分析给大家讲解C#里如何简单的校验时间格式,本次的场景属于比较常见的收单API,对第三方的订单进行签名验证,然后持久化到数据库,需要的朋友跟随小编一起看看吧
    2022-08-08
  • 详解C# ConcurrentBag的实现原理

    详解C# ConcurrentBag的实现原理

    ConcurrentBag<T>实现了IProducerConsumerCollection<T>接口,该接口主要用于生产者消费者模式下,可见该类基本就是为生产消费者模式定制的。然后还实现了常规的IReadOnlyCollection<T>类,实现了该类就需要实现IEnumerable<T>、IEnumerable、 ICollection类
    2021-06-06
  • C# WinForm编程获取文件物理路径的方法

    C# WinForm编程获取文件物理路径的方法

    这篇文章主要介绍了C# inForm编程获取文件物理路径的方法,获取的物理路径是软件即软件安装所在目录,需要的朋友可以参考下
    2014-08-08

最新评论