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中內容的功能。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM