当我们在使用电脑的时候,有时会有别人突然进入房间或者需要临时离开,这个时候我们需要有一个快捷的方式来隐藏当前程序或窗口,以避免别人看到我们的操作内容,这就是所谓的“老板键功能”。下面我来为大家介绍如何使用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
的私有静态变量和三个辅助方法:SetHook
、HookCallback
和SetWindowsHookEx
。其中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技术站