ホームページ > バックエンド開発 > C++ > C# でクリップボードの変更を検出するにはどうすればよいですか?

C# でクリップボードの変更を検出するにはどうすればよいですか?

Patricia Arquette
リリース: 2025-01-22 21:16:15
オリジナル
910 人が閲覧しました

How Can I Detect Clipboard Changes in C#?

C# によるリアルタイムのクリップボード監視

この記事では、クリップボードの変更を効率的に監視する C# アプリケーションを作成する方法を説明します。 課題は、クリップボードの内容がいつ更新されたかを検出することにあります。

解決策:

Windows メッセージ処理を利用すると、堅牢なソリューションが提供されます。これには以下が含まれます:

  1. カスタム コントロール: (Control ではなく) Component を継承するカスタム コントロールは、ウィンドウ ハンドルを取得するために重要です。 このハンドルは、Windows メッセージ キューと対話するために必要です。

  2. WndProc オーバーライド: WndProc メソッドは Windows メッセージをインターセプトします。私たちは特に WM_DRAWCLIPBOARD をターゲットとしています。

  3. WM_DRAWCLIPBOARD 処理: このメッセージはクリップボードの更新を通知します。 WndProc メソッド内では、WM_DRAWCLIPBOARD が受信されると、OnClipboardChanged メソッドが呼び出されます。

  4. データの取得: OnClipboardChanged は、Clipboard.GetDataObject() を使用して更新されたクリップボード データを取得します。

  5. イベント トリガー: 最後に、カスタム 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート