我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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 ) 
    {
     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# 屏蔽快捷键的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎样实现C#button快捷键

本篇文章为大家展示了怎样实现C#button快捷键,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。下面介绍三种方法实现C# button快捷键,如Alt + *(按钮快捷键),Ctrl+*及其他组合键
2023-06-17

Android 屏蔽和捕获Home键的示例代码

在Level5以上(包含)中,Activity类中的方法:public void onAttachedToWindow ()就能对Home键进行捕获。 具体代码如下:MainActivity.javapackage com.lingdudu
2022-06-06

android4.0屏蔽HOME键的简单实现

在android2.2 2.3中可以通过在activity中重写 代码如下:@Override public void onAttachedToWindow() {this.getWindow().setType(WindowManager
2022-06-06

C#实现设置或屏蔽热键的方法详解

这篇文章主要为大家详细介绍了如何利用C#实现设置或屏蔽热键,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
2022-12-16

Android屏蔽软键盘并且显示光标的实例详解

Android屏蔽软键盘并且显示光标的实例详解如果是android4.0以下,那么editText.setInputType(InputType.TYPE_NULL);
2023-05-30

Vim中命令、操作、快捷键的示例分析

这篇文章将为大家详细讲解有关Vim中命令、操作、快捷键的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Vim是一个类似于Vi的著名的功能强大、高度可定制的文本编辑器,在Vi的基础上改进和增加了很多
2023-06-05

win10多桌面实现快速切换的快捷键

想必玩好奇的筒子们都装上http://www.cppcns.comwin10开始体验了吧!那么你也应该从某处见识到了如何建立多桌面了吧!这个很好玩,从苹果那里学来的。但是你会发现,每次切换桌面都要去点那个小图标很麻烦,那么请问www.cpp
2023-06-09

WPF实现监听快捷键的方式分享

这篇文章主要为大家详细介绍了WPF实现监听快捷键的几种方式,文中的示例代码讲解详细,具有一定的借鉴与学习价值,需要的可以了解一下
2023-03-20

C#实现自定义屏保的示例代码

这篇文章主要为大家详细介绍了如何利用C#实现自定义屏保的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
2022-12-31

Android实现屏蔽微信拉黑和删除联系人功能示例

Android实现屏蔽微信拉黑和删除联系人功能,废话不多说,具体如下:实现效果: 让微信永远弹不出那个删除的对话框不就相当于屏蔽掉该功能了吗?哈哈效果如图:实现原理: 1.我们知道,其实微信每次删除联系人都会弹出此页面2.如果你对Acces
2022-06-06

Android编程实现Home键的屏蔽,捕获与修改方法

本文实例讲述了Android编程实现Home键的屏蔽,捕获与修改方法。分享给大家供大家参考,具体如下: 个人补充:此方法需要加权限,而且修改后拦截了home键,所以建议慎用~ 开发过程中相信大家都曾有碰到因为不能捕获Home键而烦恼,现在终
2022-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录