C# によるリアルタイムのクリップボード監視
この記事では、クリップボードの変更を効率的に監視する C# アプリケーションを作成する方法を説明します。 課題は、クリップボードの内容がいつ更新されたかを検出することにあります。
解決策:
Windows メッセージ処理を利用すると、堅牢なソリューションが提供されます。これには以下が含まれます:
カスタム コントロール: (Control
ではなく) Component
を継承するカスタム コントロールは、ウィンドウ ハンドルを取得するために重要です。 このハンドルは、Windows メッセージ キューと対話するために必要です。
WndProc
オーバーライド: WndProc
メソッドは Windows メッセージをインターセプトします。私たちは特に WM_DRAWCLIPBOARD
をターゲットとしています。
WM_DRAWCLIPBOARD
処理: このメッセージはクリップボードの更新を通知します。 WndProc
メソッド内では、WM_DRAWCLIPBOARD
が受信されると、OnClipboardChanged
メソッドが呼び出されます。
データの取得: OnClipboardChanged
は、Clipboard.GetDataObject()
を使用して更新されたクリップボード データを取得します。
イベント トリガー: 最後に、カスタム ClipboardChanged
イベントが発生し、新しいデータが渡されます。
クリップボード監視コントロールを示すコード例は次のとおりです。
<code class="language-csharp">using System; using System.ComponentModel; using System.Runtime.InteropServices; using System.Windows.Forms; using System.Drawing; namespace ClipboardMonitorApp { [DefaultEvent("ClipboardChanged")] public class ClipboardMonitor : Control { private IntPtr nextClipboardViewer; public ClipboardMonitor() { this.BackColor = Color.Red; this.Visible = false; nextClipboardViewer = SetClipboardViewer((int)this.Handle); } public event EventHandler<ClipboardChangedEventArgs> ClipboardChanged; protected override void Dispose(bool disposing) { ChangeClipboardChain(this.Handle, nextClipboardViewer); base.Dispose(disposing); } [DllImport("User32.dll")] private static extern int SetClipboardViewer(int hWndNewViewer); [DllImport("User32.dll", CharSet = CharSet.Auto)] private static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext); [DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam); protected override void WndProc(ref Message m) { 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; } } private void OnClipboardChanged() { try { IDataObject data = Clipboard.GetDataObject(); ClipboardChanged?.Invoke(this, new ClipboardChangedEventArgs(data)); } catch (Exception ex) { // Handle exceptions appropriately (e.g., log the error) MessageBox.Show(ex.ToString()); } } } public class ClipboardChangedEventArgs : EventArgs { public readonly IDataObject DataObject; public ClipboardChangedEventArgs(IDataObject dataObject) { DataObject = dataObject; } } }</code>
この洗練されたコードは、C# アプリケーションでクリップボードの変更を監視するための、より堅牢でエラー処理されたソリューションを提供します。 運用環境では、潜在的な例外を適切に処理することを忘れないでください。
以上がC# でクリップボードの変更を検出するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。