當我們使用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中內容的功能。