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日

相关文章

  • C#实现左截取和右截取字符串实例

    C#是一种强类型的面向对象编程语言,同时也支持字符串操作。在C#中,我们可以使用Substring方法来实现左截取和右截取字符串。 具体的实现方法如下: 左截取字符串 我们可以使用Substring方法实现左截取字符串,方法的参数时从左边开始截取的字符个数。 下面是一个示例代码: string str = "hello, world"; …

    C# 2023年6月8日
    00
  • c#发送请求访问外部接口的实例

    下面是详细的讲解“c#发送请求访问外部接口的实例”的完整攻略。 1. 创建HttpClient实例 使用HttpClient类发送HTTP请求。HttpClient类位于System.Net.Http命名空间中。可以在项目中添加对System.Net.Http命名空间的引用来使用HttpClient类。 示例代码: using System.Net.Http…

    C# 2023年5月31日
    00
  • C#导出Excel的示例详解

    C#导出Excel的示例详解 介绍 在实际的项目中,我们经常需要将数据导出到Excel表格中,以方便查阅和管理。C#作为一门强大的编程语言,在导出Excel方面也有非常不错的表现。本篇文章将详细讲解如何使用C#导出Excel表格。 准备工作 我们需要使用C#自带的OpenXML库来实现Excel的导出。在使用前,需要进行一些准备工作: 引入DocumentF…

    C# 2023年6月7日
    00
  • C#利用win32 Api 修改本地系统时间、获取硬盘序列号

    修改本地系统时间 首先需要导入System.Runtime.InteropServices这个命名空间. using System.Runtime.InteropServices; 然后我们通过GetSystemTime方法获取系统时间,再通过SetSystemTime方法修改系统时间. [DllImport("Kernel32.dll"…

    C# 2023年6月1日
    00
  • C# 在项目中引用x86 x64的非托管代码的方法

    使用 C# 项目引入 x86 x64 非托管代码的方法可以分为以下几步: 1. 创建 C# 项目 首先,需要创建一个 Visual Studio C# 项目,选择类型为“Class Library”。 2. 引入非托管 DLL 文件 在项目中添加 x86 和 x64 能够使用的非托管 DLL 文件,可以通过添加已存在的项目形式进行添加。 右键项目文件夹,在菜…

    C# 2023年6月6日
    00
  • C# Request.Form用法案例详解

    C# Request.Form用法案例详解 简介 Request对象是ASP.NET Web应用程序中的内置对象,用于在Web服务器上处理HTTP请求。其中,Request.Form是一个集合,用于获取HTTP POST的表单值。Request.Form的用法非常简单,可以通过指定表单控件的名称来获取该表单控件的值。 使用方法 //获取提交表单值 strin…

    C# 2023年6月1日
    00
  • C#基于COM方式读取Excel表格的方法

    下面是C#基于COM方式读取Excel表格的方法的完整攻略。 一、前置条件准备 在使用C#基于COM方式读取Excel表格之前,需要先安装Microsoft Office软件(建议安装MS Office 2010及以上版本),并且安装后需要以管理员身份运行Excel至少一次,以防Excel第一次运行时的初始化过程出错。 二、在C#中使用Excel COM组件…

    C# 2023年6月8日
    00
  • C# Linq的Join()方法 – 将两个序列中的元素联接在一起

    C#中的Linq提供了Join()方法来实现两个数据源之间的连接。Join()方法接受四个参数,可以在连接过程中指定连接的条件以及返回的结果类型等信息。接下来,我将为您提供一个完整的攻略来详细讲解C# Linq的Join()方法。 Join()方法的基本语法 下面是Join()方法的基本语法: var result = from s in source1 j…

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