C# クリップボード変更監視メソッド
C# 自体は、クリップボード変更の専用イベントを直接通知しません。ただし、補助コントロールを介して「クリップボード監視」機能を実装することで、この問題を解決できます。
このメソッドでは、Control
クラスを継承し、ClipboardChanged
イベントを含むカスタム コントロールを作成する必要があります。コントロールのコンストラクターは、クリップボード ビューア ウィンドウを設定し、それをクリップボード チェーンにアタッチする必要があります。
クリップボードの内容が変更されると、コントロールの WndProc
メソッドが WM_DRAWCLIPBOARD
メッセージをインターセプトし、ClipboardChanged
イベントをトリガーします。このイベント ハンドラーを使用して、変更されたクリップボードの内容を取得できます。
次に、クリップボード監視コントロールの実装例を示します。
<code class="language-csharp">using System; using System.ComponentModel; using System.Runtime.InteropServices; using System.Windows.Forms; using System.Drawing; namespace ClipboardAssist { // 必须继承Control,而不是Component,才能拥有Handle [DefaultEvent("ClipboardChanged")] public partial class ClipboardMonitor : Control { IntPtr nextClipboardViewer; public ClipboardMonitor() { this.BackColor = Color.Red; this.Visible = false; nextClipboardViewer = (IntPtr)SetClipboardViewer((int)this.Handle); } /// <summary> /// 剪贴板内容已更改。 /// </summary> public event EventHandler<ClipboardChangedEventArgs> ClipboardChanged; protected override void Dispose(bool disposing) { ChangeClipboardChain(this.Handle, nextClipboardViewer); } [DllImport("User32.dll")] protected static extern int SetClipboardViewer(int hWndNewViewer); [DllImport("User32.dll", CharSet = CharSet.Auto)] public static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext); [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam); protected override void WndProc(ref System.Windows.Forms.Message m) { // 定义于winuser.h const int WM_DRAWCLIPBOARD = 0x308; const int WM_CHANGECBCHAIN = 0x030D; switch (m.Msg) { case WM_DRAWCLIPBOARD: OnClipboardChanged(); SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam); break; case WM_CHANGECBCHAIN: if (m.WParam == nextClipboardViewer) nextClipboardViewer = m.LParam; else SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam); break; default: base.WndProc(ref m); break; } } void OnClipboardChanged() { try { IDataObject iData = Clipboard.GetDataObject(); if (ClipboardChanged != null) { ClipboardChanged(this, new ClipboardChangedEventArgs(iData)); } } catch (Exception e) { // 忽略或弹出,不确定 // Trace.Write(e.ToString()); MessageBox.Show(e.ToString()); } } } public class ClipboardChangedEventArgs : EventArgs { public readonly IDataObject DataObject; public ClipboardChangedEventArgs(IDataObject dataObject) { DataObject = dataObject; } } }</code>
このコントロールを使用すると、C# アプリケーションでのクリップボードの変更を監視できます。
以上がC# でクリップボードの変更を監視するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。