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

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

Susan Sarandon
リリース: 2025-01-22 21:06:14
オリジナル
197 人が閲覧しました

How to Monitor Clipboard Changes in C#?

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 サイトの他の関連記事を参照してください。

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