2023年11月25日发(作者:)

Winform使⽤热键功能实现Ctrl+CCtrl+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 + CCtrl+V都没有

任何效果。

2. 我们添加⼀个新类HotKeysManager,这个类会使⽤DllImport特性引⼊,然后封装⾥⾯的两个⽅法 RegisterHotKey

UnregisterHotKey,代码如下:

using System;

using c;

using ;

using pServices;

using ;

using ;

using ;

namespace HotKey

{

public class HotKeysManager

{

//如果函数执⾏成功,返回值不为0

//如果函数执⾏失败,返回值为0。要得到扩展错误信息,调⽤GetLastError

[DllImport("", SetLastError = true)]

public static extern bool RegisterHotKey(

IntPtr hWnd, //要定义热键的窗⼝的句柄

int id, //定义热键ID(不能与其它ID重复)

KeyModifiers fsModifiers, //标识热键是否在按AltCtrlShiftWindows等键时才会⽣效

Keys vk //定义热键的内容

);

[DllImport("", 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 + CCtrl + V在⿏标离开Copy me时我们注销热键Ctrl + CCtrl + 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 ()

{

case WM_HOTKEY:

switch (32())

{

case 100:

t(this.);

break;

case 101:

this. = t();

break;

}

break;

}

base.WndProc(ref m);

}

private void labelTest_MouseLeave(object sender, EventArgs e)

{

//注销Id号为100的热键设定

sterHotKey(Handle, 100);

//注销Id号为101的热键设定

sterHotKey(Handle, 101);

}

private void labelTest_MouseEnter(object sender, EventArgs e)

{

//注册热键Ctrl+CId号为100。。

erHotKey(Handle, 100, , Keys.C);

//注册热键Ctrl+VId号为101

erHotKey(Handle, 101, , Keys.V);

}

这样我们就实现了Ctrl + CCtrl + V 复制粘贴label中内容的功能。