用途:用于监视系统剪贴板
步骤:
系统API
/// <summary> /// 剪贴板内容改变时API函数向windows发送的消息 /// </summary> const int WM_CLIPBOARDUPDATE = 0x031D; /// <summary> /// windows用于监视剪贴板的API函数 /// </summary> /// <param name="hwnd">要监视剪贴板的窗口的句柄</param> /// <returns>成功则返回true</returns> [DllImport("user32.dll")]//引用dll,确保API可用 public static extern bool AddClipboardFormatListener(IntPtr hwnd); /// <summary> /// 取消对剪贴板的监视 /// </summary> /// <param name="hwnd">监视剪贴板的窗口的句柄</param> /// <returns>成功则返回true</returns> [DllImport("user32.dll")]//引用dll,确保API可用 public static extern bool RemoveClipboardFormatListener(IntPtr hwnd);
注册监视剪贴板改变API
/// <summary> WPF窗口重写 </summary> protected override void OnSourceInitialized(EventArgs e) { base.OnSourceInitialized(e); this.win_SourceInitialized(this, e); // HTodo :添加剪贴板监视 System.IntPtr handle = (new System.Windows.Interop.WindowInteropHelper(this)).Handle; AddClipboardFormatListener(handle); } /// <summary> 添加监视消息 </summary> void win_SourceInitialized(object sender, EventArgs e) { HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource; if (hwndSource != null) { hwndSource.AddHook(new HwndSourceHook(WndProc)); } } /// <summary> 剪贴板内容改变 </summary> void OnClipboardChanged() { // HTodo :复制的文件路径 string text = System.Windows.Clipboard.GetText(); if (!string.IsNullOrEmpty(text)) { if (this._viewModel.ClipBoradSource.Count > 0) { ClipBoradBindModel last = this._viewModel.ClipBoradSource.First(); if (last.Detial != text) { ClipBoradBindModel f = new ClipBoradBindModel(text, ClipBoardType.Text); this._viewModel.ClipBoradSource.Insert(0, f); } } else { ClipBoradBindModel f = new ClipBoradBindModel(text, ClipBoardType.Text); this._viewModel.ClipBoradSource.Insert(0, f); } } // HTodo :复制的文件 System.Collections.Specialized.StringCollection list = System.Windows.Clipboard.GetFileDropList(); foreach (var item in list) { if (Directory.Exists(item) || File.Exists(item)) { if (this._viewModel.ClipBoradSource.Count > 0) { ClipBoradBindModel last = this._viewModel.ClipBoradSource.First(); if (last.Detial != item) { ClipBoradBindModel f = new ClipBoradBindModel(item, ClipBoardType.FileSystem); this._viewModel.ClipBoradSource.Insert(0, f); } } else { ClipBoradBindModel f = new ClipBoradBindModel(item, ClipBoardType.FileSystem); this._viewModel.ClipBoradSource.Insert(0, f); } } } //// HTodo :复制的图片 //BitmapSource bit = System.Windows.Clipboard.GetImage(); //if (bit != null) //{ // if (this._viewModel.ClipBoradSource.Count > 0) // { // ClipBoradBindModel last = this._viewModel.ClipBoradSource.First(); // if (last.Detial != bit.ToString()) // { // ClipBoradBindModel f = new ClipBoradBindModel(bit.ToString(), ClipBoardType.Image); // this._viewModel.ClipBoradSource.Insert(0, f); // } // } // else // { // ClipBoradBindModel f = new ClipBoradBindModel(bit.ToString(), ClipBoardType.Image); // this._viewModel.ClipBoradSource.Insert(0, f); // } //} } Action ClipboardChangedHandle;
#region - 系统消息 - protected virtual IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { switch (msg) { case WM_CLIPBOARDUPDATE: { if (isclipDoubleClick <= 0) { if (ClipboardChangedHandle != null) { // HTodo :触发剪贴板变化事件 ClipboardChangedHandle.Invoke(); } } isclipDoubleClick--; } break; } return IntPtr.Zero; } #endregion
示例: