Winform使⽤热键功能实现Ctrl+C和Ctrl+V复制粘贴功能
当我们使⽤winform控件的时候,会发现这些控件(⽐如Label)不⽀持Ctrl+c 复制和Ctrl+v 快捷键复制粘贴功能,如果我们需要实现这个功能改怎么做呢?
1. ⾸先我们创建⼀个winform项⽬。
陶慧敏照片
在项⽬中我们在form上添加三个控件,两个label和⼀个textBox
我们将要实现的功能是在Copy me这个label上使⽤Ctrl + C可以将这个label显⽰的内容“Copy me”复制到剪贴板中,当我们在textbox控件⾥⾯使⽤ Ctrl + V的时候可以将剪贴板的字符串复制到textbox控件,然后我们在textBox⾥⾯修改字符串使⽤Ctrl + C 复制字符串,然后选中Copy me label使⽤ Ctrl + V可以把textbox的值复制到Copy me这个label⾥⾯,但是选中Can not copy这个label使⽤Ctrl + C和Ctrl+V都没有任何效果。
2. 我们添加⼀个新类HotKeysManager,这个类会使⽤DllImport特性引⼊user32.dll,然后封装⾥⾯的两个⽅法 RegisterHotKey和UnregisterHotKey,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace HotKey
{
public class HotKeysManager
{
//如果函数执⾏成功,返回值不为0。
明星陪睡//如果函数执⾏失败,返回值为0。要得到扩展错误信息,调⽤GetLastError。
[DllImport("user32.dll", SetLastError = true)]
public static extern bool RegisterHotKey(
IntPtr hWnd,                //要定义热键的窗⼝的句柄
int id,                    //定义热键ID(不能与其它ID重复)
KeyModifiers fsModifiers,  //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会⽣效
Keys vk                    //定义热键的内容
);
[DllImport("user32.dll", SetLastError = true)]
public static extern bool UnregisterHotKey(
IntPtr hWnd,                //要取消热键的窗⼝的句柄
int id                      //要取消热键的ID
);
//定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举⽽直接使⽤数值)
[Flags()]
public enum KeyModifiers
{
None = 0,
Alt = 1,
Ctrl = 2,
Shift = 4,
WindowsKey = 8
}
}
}
3, 在Form中我们在⿏标进⼊Copy me 时来注册热键Ctrl + C和Ctrl + V在⿏标离开Copy me时我们注销热键Ctrl + C和Ctrl + V,然后重载WndProc⽅法捕获热键消息,如果是Ctrl + C就复制Copy me⾥⾯的值到剪贴板,如果Ctrl + V就把剪贴板的内容复制到Copy me label⾥⾯。
请看代码:
///重载FromA中的WndProc函数
///监视Windows消息
///重载WndProc⽅法,⽤于实现热键响应
protected override void WndProc(ref Message m)
{妈妈怀里的歌
const int WM_HOTKEY = 0x0312;
//按快捷键
switch (m.Msg)
{
case WM_HOTKEY:
世界香水品牌
switch (m.WParam.ToInt32())
{
case100:
Clipboard.SetText(this.labelTest.Text);
break;
case101:
this.labelTest.Text = Clipboard.GetText();
break;
}
break;
}
base.WndProc(ref m);
}
private void labelTest_MouseLeave(object sender, EventArgs e)
{
//注销Id号为100的热键设定
HotKeysManager.UnregisterHotKey(Handle, 100);
//注销Id号为101的热键设定
茅子俊HotKeysManager.UnregisterHotKey(Handle, 101);
}
private void labelTest_MouseEnter(object sender, EventArgs e)
{
/世界第一美女是谁
/注册热键Ctrl+C,Id号为100。。
HotKeysManager.RegisterHotKey(Handle, 100, HotKeysManager.KeyModifiers.Ctrl, Keys.C);
//注册热键Ctrl+V,Id号为101。
HotKeysManager.RegisterHotKey(Handle, 101, HotKeysManager.KeyModifiers.Ctrl, Keys.V);
}
这样我们就实现了Ctrl + C和Ctrl + V 复制粘贴label中内容的功能。