zoukankan      html  css  js  c++  java
  • 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())
                        {
                            case 100:
                                Clipboard.SetText(this.labelTest.Text);             
                                break;
                            case 101:   
                                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中内容的功能。

  • 相关阅读:
    C# 类动态添加属性、方法(Z)
    WPF三大模板简介(Z)
    C# mongodb 驱动操作(Z)
    解析Exception和C#处理Exception的常用方法总结
    创建 WPF 工具箱控件
    WPF 线程 Dispatcher
    Path
    C#操作字符串方法总结<转>
    P2058 海港
    P2234 [HNOI2002]营业额统计
  • 原文地址:https://www.cnblogs.com/ZhangDamon/p/11874100.html
Copyright © 2011-2022 走看看