> 백엔드 개발 > C++ > C#에서 클립보드 변경 사항을 어떻게 감지할 수 있나요?

C#에서 클립보드 변경 사항을 어떻게 감지할 수 있나요?

Patricia Arquette
풀어 주다: 2025-01-22 21:16:15
원래의
909명이 탐색했습니다.

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. 데이터 검색: OnClipboardChangedClipboard.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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿