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#调用dll提示

    下面我将为您详细讲解“解决C#调用dll提示”的完整攻略。 1.了解动态链接库 首先,我们需要了解什么是动态链接库。动态链接库(Dynamic Link Library,缩写为DLL)是Windows下的一种动态链接库文件,包含可重定位的代码、数据和资源,可以被多个软件程序同时使用。 2.将dll文件添加到项目中 在使用dll文件之前,我们需要将其添加到我们…

    C# 2023年5月15日
    00
  • 浅谈C#在网络波动时防重复提交的方法

    浅谈C#在网络波动时防重复提交的方法 在Web开发中,防止重复提交是一个非常常见的问题。当网络波动或者用户重复点击提交按钮时,很容易导致重复提交。本文将介绍一些C#在防止重复提交方面的方法,希望能帮助大家解决这个问题。 方案1:使用Session来控制重复提交 在C#中,可以使用Session来控制重复提交。每次提交请求时,将表单提交的信息与Session中…

    C# 2023年6月2日
    00
  • .NET Framework各版本(.NET2.0 3.0 3.5 4.0)区别

    下面是关于“.NET Framework各版本(.NET 2.0、3.0、3.5、4.0)区别”的完整攻略,包含两个示例。 1. .NET Framework各版本区别 .NET Framework是一个由Microsoft开发的应用程序框架,用于在Windows操作系统上开发和运行各种类型的应用程序。下面是.NET Framework各版本的区别: .NE…

    C# 2023年5月15日
    00
  • Asp.net通过SignalR2进行实时聊天

    下面我将详细讲解“Asp.net通过SignalR2进行实时聊天”的完整攻略,包括如何使用SignalR2构建一个简单的实时聊天程序。 SignalR2是什么? SignalR2 是一个基于 ASP.NET 的开源框架,用于实时 Web 应用程序。它使得实时通讯变得简单,可以实现实时的消息推送、实时的服务器推送以及实时的交互等。 步骤 下面将以 Visual…

    C# 2023年6月3日
    00
  • 深入浅出掌握Unity ShaderLab语法基础

    请听我详细讲解“深入浅出掌握Unity ShaderLab语法基础”的完整攻略。 一、ShaderLab语法基础概述 ShaderLab是Unity中用于编写着色器的语言,它基于CG语言编写,同时又封装了一些常用的函数和数据结构,使得着色器开发变得容易而高效。在使用ShaderLab编写着色器时,需要定义一个合法的Shader程序,并且指定使用哪种渲染方式。…

    C# 2023年6月3日
    00
  • C#线程间通信的异步机制

    C#线程间通信是一个常见的问题,当我们需要在多个线程间共享数据或者进行协作时,就需要使用线程间通信机制。异步机制是其中一种常用的通信方式,其可以有效避免线程阻塞的问题,并且能够方便地实现所需的功能。 本文将为大家详细讲解C#线程间通信的异步机制,包括异步编程模型(APM)、基于事件的异步编程模型(EAP)和基于任务的异步编程模型(TAP)。并且通过两个示例来…

    C# 2023年6月3日
    00
  • 基于C#实现屏幕桌面截图

    下面是基于C#实现屏幕桌面截图的完整攻略。 概述 屏幕截图是一种常见的软件功能,可以用于捕捉屏幕上的图片,可以用于制作教程、演示文稿等。在本篇攻略中,我们将使用C#实现屏幕截图功能。具体来说,我们将使用System.Drawing命名空间下的相关类,实现对桌面的截图。 实现步骤 步骤1:创建C#控制台应用程序 打开Visual Studio,选择“创建新项目…

    C# 2023年6月6日
    00
  • C#中LINQ多条件JOIN时为什么可以使用匿名类

    在C#中,如果要进行多条件JOIN,则可以使用匿名类型。这是因为多条件JOIN涉及到多个表或者是同一个表的多个字段,需要指定具体的条件。而匿名类型可以方便地创建一个临时的类型,其中可以包含多个字段,从而满足多条件JOIN的需求。 具体实现步骤: 1.创建匿名类型 在C#中,可以使用var关键字创建匿名类型,var类型会在编译时自动推断出匿名类型的具体类型信息…

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