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#中var关键字用法浅谈

    C#中var关键字用法浅谈 在C#中,var关键字可以用于自动类型推断。它被用来声明一个变量,让编译器根据右侧的值来推断变量的类型,可以在某些情况下帮助简化代码,提高可读性。 var的使用 使用var的语法格式如下: var variableName = initialValue; 在这里,我们声明一个变量variableName,并给它赋予一个初始值ini…

    C# 2023年6月7日
    00
  • C#操作配置文件app.config、web.config增删改

    C#操作配置文件app.config、web.config增删改可以使用System.Configuration命名空间中的ConfigurationManager和Configuration类。下面分别介绍这两个类的使用方法: 1.使用ConfigurationManager读写配置文件 ConfigurationManager类可以方便地读写配置文件,其…

    C# 2023年6月1日
    00
  • .net设计模式之装饰模式(Decorator)

    当我们需要在不改变原有类的情况下对其进行新功能添加或修改时,装饰模式是一种适用的设计模式。它允许向一个现有对象添加新的功能,同时又不改变其结构。该模式是一种结构性模式。 装饰模式(Decorator)的基本结构 装饰模式有四个角色: 抽象构建(Component):定义一个对象接口,可以给这些对象动态地添加职责。 具体构建(ConcreteComponent…

    C# 2023年6月3日
    00
  • Entity Framework映射TPH、TPT、TPC与继承类

    Entity Framework是一种ORM(Object-Relational Mapping)技术,可以将对象映射到数据库中的关系表。在Entity Framework中,支持三种继承映射策略:TPH(Table Per Hierarchy)、TPT(Table Per Type)和TPC(Table Per Concrete class)。 TPH(T…

    C# 2023年5月31日
    00
  • C#中is,as,using关键字的使用说明

    当使用C#编写程序时,is,as以及using是经常用到的关键字。下面将分别介绍它们的使用说明。 is is关键字用于判断一个对象是否是某个类或其派生类的实例。 示例1:判断一个对象是否是List类的实例。 List<int> list = new List<int>(); if (list is List<int>) {…

    C# 2023年5月15日
    00
  • 关于正则表达式基本语法的应用详解(必看篇)

    关于正则表达式基本语法的应用详解(必看篇) 1. 正则表达式(RegExp)是什么? 正则表达式(RegExp,又称正规表达式、正则表示式、正则表达式式、规则表达式等)是计算机科学中的一个概念。它可以用来匹配特定模式的文本,并对符合条件的文本进行操作。 2. 正则表达式的基本语法 2.1 字符组 使用方括号表示,可以匹配括号内的任意字符。 示例: var r…

    C# 2023年6月7日
    00
  • c# 遍历获取所有文件的示例代码

    针对“c# 遍历获取所有文件的示例代码”的完整攻略,我将通过以下几个步骤详细说明。 1. 确定遍历目标 在编写代码之前,需要先明确需要遍历的目标文件夹。可以通过以下方式获取目标文件夹路径,此处以桌面为例: string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desk…

    C# 2023年5月31日
    00
  • C#中实现一次执行多条带GO的sql语句实例

    要在C#中实现一次执行多条带GO的SQL语句,通常有以下两种方法: 将一次执行多条带GO的SQL语句拆分成多个SQL语句进行执行。 在C#中,可以使用SqlConnection、SqlCommand等类库来连接并操作SQL Server数据库。针对上述需求,可以通过以下代码将多条带GO的SQL语句分割开: string sql = @" SELEC…

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