C#实现老板键功能的代码

当我们在使用电脑的时候,有时会有别人突然进入房间或者需要临时离开,这个时候我们需要有一个快捷的方式来隐藏当前程序或窗口,以避免别人看到我们的操作内容,这就是所谓的“老板键功能”。下面我来为大家介绍如何使用C#来实现老板键功能的代码。

1. 原理

老板键功能的实现原理是通过监听操作系统的键盘事件,当监听到我们设定的快捷键时,就会触发我们的代码来执行指定的操作,此时我们可以将窗口最小化或隐藏。

2. 实现步骤

2.1 引入命名空间

在开始编写代码之前,我们需要先引入一些命名空间,以便我们后续的代码实现:

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

2.2 创建系统钩子

要想监听系统键盘事件,我们需要创建一个系统钩子,然后通过回调函数来接收操作系统传递过来的键盘事件。

在实现这个方法之前,需要注意的是,由于我们需要全局监听键盘事件,所以这个方法需要被定义为一个静态方法,而这个静态方法又需要被定义在一个静态类中,具体代码如下:

public static class SystemKeyListener
{
    private static readonly LowLevelKeyboardProc _proc = HookCallback;
    private static IntPtr _hookID = IntPtr.Zero;

    private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);

    private static IntPtr SetHook(LowLevelKeyboardProc proc)
    {
        using (Process curProcess = Process.GetCurrentProcess())
        using (ProcessModule curModule = curProcess.MainModule)
        {
            return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);
        }
    }

    private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
    {
        if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
        {
            int vkCode = Marshal.ReadInt32(lParam);
            // TODO: 要执行的代码
        }
        return CallNextHookEx(_hookID, nCode, wParam, lParam);
    }

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool UnhookWindowsHookEx(IntPtr hhk);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr GetModuleHandle(string lpModuleName);

    private const int WH_KEYBOARD_LL = 13;
    private const int WM_KEYDOWN = 0x0100;

    public static void SetHook()
    {
        _hookID = SetHook(_proc);
    }

    public static void Unhook()
    {
        UnhookWindowsHookEx(_hookID);
    }
}

在这个代码中,我们定义了一个静态类SystemKeyListener,并在其中定义了一个名为_proc的私有静态变量和三个辅助方法:SetHookHookCallbackSetWindowsHookEx。其中SetWindowsHookEx方法用来创建系统钩子,HookCallback方法用来处理接收的键盘事件,SetHook方法用来将一个钩子挂在钩子链中。

2.3 监听快捷键事件

当我们完成了系统钩子的创建后,我们需要找到我们所选定的快捷键,并通过系统钩子的事件响应机制来监听这个快捷键的触发事件。具体代码如下:

public static void SetHook(Keys key, Action action)
{
    _hookID = SetHook(_proc);

    // 屏蔽掉键名为 key 的键
    _blockedKeys.Add(key);

    // 保存注册的动作委托
    _keyActions.Add(key, action);
}

private static readonly List<Keys> _blockedKeys = new List<Keys>();
private static readonly Dictionary<Keys, Action> _keyActions = new Dictionary<Keys, Action>();

private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
    if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
    {
        int vkCode = Marshal.ReadInt32(lParam);
        Keys key = (Keys)vkCode;

        if (!_blockedKeys.Contains(key))
        {
            if (_keyActions.ContainsKey(key))
            {
                _keyActions[key]();
                return (IntPtr)1;
            }
        }
    }
    return CallNextHookEx(_hookID, nCode, wParam, lParam);
}

在这个代码中,我们先定义了一个静态变量表示被屏蔽掉的键_blockedKeys,以及一个字典用来保存用户绑定的动作起始键和要执行的委托函数的映射_keyActions。当我们设置了快捷键和要执行的动作后,我们会将按下的键屏蔽掉,避免误触。在接到键盘事件的回调函数中,如果这个事件不是被屏蔽掉的按键,那么就可以根据字典中的映射来执行相应的动作。

2.4 代码示例

下面是一个展示如何使用老板键功能的C#示例代码,这个代码可以使用“Ctrl+Alt+M”来切换窗口的显示状态:

private void MainForm_Load(object sender, EventArgs e)
{
    SystemKeyListener.SetHook(Keys.Control | Keys.Alt | Keys.M, () => 
    {
        if (this.Visible)
        {
            this.Hide();
        }
        else
        {
            this.Show();
            this.WindowState = FormWindowState.Normal;
        }
    });
}

在这个代码示例中,我们绑定了“Ctrl+Alt+M”这个组合键,然后通过回调函数来切换窗口的显示状态。当窗口已经显示时,按下快捷键会将窗口隐藏;当窗口已经隐藏时,按下快捷键会显示窗口。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现老板键功能的代码 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年6月1日

相关文章

  • Asp.Net Core使用swagger生成api文档的完整步骤

    在ASP.NET Core中,可以使用Swagger来生成API文档。本攻略将深入探讨如何使用Swagger生成API文档,并提供两个示例说明。 使用Swagger生成API文档 使用Swagger生成API文档的步骤如下: 1. 添加Swashbuckle.AspNetCore包 我们需要添加Swashbuckle.AspNetCore包来使用Swagge…

    C# 2023年5月17日
    00
  • .Net Core 配置文件读取IOptions,IOptionsMonitor,IOptionsSnapshot

    当我们在 .NET Core 应用程序中需要读取配置文件时,可以使用 IOptions、IOptionsMonitor 和 IOptionsSnapshot 接口。这些接口提供了不同的方式来读取配置文件,并且可以根据需要自动更新配置值。 以下是详细的攻略: 步骤1:创建配置文件 在项目中创建一个名为 appsettings.json 的配置文件,并添加以下内…

    C# 2023年5月12日
    00
  • .net core中Grpc使用报错:The remote certificate is invalid according to the validation procedure.

    因为Grpc采用HTTP/2作为通信协议,默认采用LTS/SSL加密方式传输,比如使用.net core启动一个服务端(被调用方)时:   public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWe…

    C# 2023年4月19日
    00
  • Unity实现车型识别的示例代码

    下面就是Unity实现车型识别的完整攻略。 环境准备 在开始前,请确保你已经按照Unity开发的常规流程,搭建好了开发环境。并且已经安装好了Vuforia引擎,可以顺利地在Unity 中进行二维码识别、3D 模型跟踪等处理操作。 示例1:车型识别的基本实现 1.创建识别库: 在Vuforia的开发者后台中,创建一个识别库,可以使用目标生成器(Target M…

    C# 2023年6月3日
    00
  • ASP.NET中Dictionary基本用法实例分析

    下面是ASP.NET中Dictionary基本用法实例分析的攻略: 概述 在ASP.NET中Dictionary是一种非常常用的数据结构,主要用于存储键值对。它可以帮助我们快速查询键对应的值,是一种高效的存储方式。本篇攻略将对ASP.NET中Dictionary的基本用法进行详细的讲解,并且提供两个实例来帮助理解。 Dictionary基本用法 创建Dict…

    C# 2023年6月3日
    00
  • C#中DataTable 转实体实例详解

    下面是关于“C#中DataTable 转实体实例详解”的完整攻略: 1. 为什么需要将DataTable转为实体实例 在C#中,DataTable是一种非常常见的数据类型。在我们进行数据查询、统计和展示时,经常使用DataTable来存储数据。而在使用DataTable时,我们通常需要将DataTable中的数据转化为我们自定义的实体类型,利用实体的属性和方…

    C# 2023年5月31日
    00
  • ASP.net中获取客户端参数操作系统信息

    获取客户端参数操作系统信息对于一些网站运营来说可能是很有用的信息,比如针对不同操作系统的用户可以进行不同的推荐或者展示。在ASP.net中获取客户端参数操作系统信息可以通过以下步骤实现: 在 ASP.net 页面的 header 部分添加以下代码块: <script type="text/javascript"> functi…

    C# 2023年6月3日
    00
  • C#/VB.NET 在Word中添加条码、二维码的示例代码

    请注意以下的详细攻略: 准备工作 在使用C#/VB.NET代码添加条码或者二维码前,我们需要先安装对应的NuGet包。在Visual Studio中,可以通过NuGet Package Manager来安装。 对于添加条码,我们可以使用一个叫做ZXing.Net的Nuget包。ZXing.Net是一个用C#编写的开源程序库,用于读写二维码和条形码。它支持多种…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部