클립보드는 Windows에 내장된 매우 유용한 도구로, 작은 클립보드를 통해 전송 및 공유가 가능합니다. 다양한 애플리케이션 간의 정보. 그러나 문제는 클립보드가 하나의 데이터 복사본만 보관할 수 있고 새 데이터가 전달될 때마다 이전 데이터를 덮어쓰게 된다는 것입니다.
가장 중요한 것은 SetClipboardViewer입니다. 클립보드의 내용이 변경될 때마다 WM_DRAWCLIPBOARD를 통해 알림을 받을 창을 추가하는 기능입니다. 메시지 창 체인.
클립보드 뷰어 체인의 다음 창에 대한 핸들이 아직 반환되지 않았으므로 애플리케이션은 SetClipboardViewer를 호출하는 동안 수신한 WM_DRAWCLIPBOARD 메시지를 전달해서는 안 됩니다
.
클립보드 관찰자 체인에서 창 체인을 제거하려면 애플리케이션이 ChangeClipboard 멤버 함수를 호출해야 합니다.
#region Definitions //Constants for API Calls... private const int WM_DRAWCLIPBOARD = 0x308; private const int WM_CHANGECBCHAIN = 0x30D; //Handle for next clipboard viewer... private IntPtr mNextClipBoardViewerHWnd; //API declarations... [DllImport("user32.dll", CharSet = CharSet.Auto)] static public extern IntPtr SetClipboardViewer(IntPtr hWndNewViewer); [DllImport("user32.dll", CharSet = CharSet.Auto)] static public extern bool ChangeClipboardChain(IntPtr HWnd, IntPtr HWndNext); [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam); #endregion
운영 체제는 왼쪽 버튼을 아래로, 왼쪽 버튼을 위로 누르는 등 일련의 메시지를 애플리케이션에 보냅니다. GetMessage 다른 메서드는 최종적으로 응용 프로그램에서 정의한 창 프로세스에 대한 포인터를 가리키는 창 프로세스(WndProc [영어로 전체 이름: windows 프로세스])에 메시지를 제출합니다.
클립보드 내용 변경 이벤트를 처리하려면 이 함수를 다시 작성해야 합니다.
#region Message Process //Override WndProc to get messages... protected override void WndProc(ref Message m) { switch (m.Msg) { case WM_DRAWCLIPBOARD: { //The clipboard has changed... //########################################################################## // Process Clipboard Here :)........................ //########################################################################## SendMessage(mNextClipBoardViewerHWnd, m.Msg, m.WParam.ToInt32(), m.LParam.ToInt32()); //显示剪贴板中的文本信息 if (Clipboard.ContainsText()) { label1.Text = Clipboard.GetText(); } //显示剪贴板中的图片信息 if (Clipboard.ContainsImage()) { pictureBox1.Image = Clipboard.GetImage(); pictureBox1.Update(); } break; } case WM_CHANGECBCHAIN: { //Another clipboard viewer has removed itself... if (m.WParam == (IntPtr)mNextClipBoardViewerHWnd) { mNextClipBoardViewerHWnd = m.LParam; } else { SendMessage(mNextClipBoardViewerHWnd, m.Msg, m.WParam.ToInt32(), m.LParam.ToInt32()); } break; } } base.WndProc(ref m); } #endregion
효과:
위 내용은 C#에서 Windows 클립보드 모니터를 구현하기 위한 코드에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!