Die Zwischenablage ist ein sehr nützliches, in Windows integriertes Tool. Über die kleine Zwischenablage ist das Übertragen und Teilen möglich Informationen zwischen verschiedenen Anwendungen. Der Haken an der Sache ist jedoch, dass die Zwischenablage nur eine Kopie der Daten speichern kann und jedes Mal, wenn neue Daten eingegeben werden, die alten überschrieben werden.
Wenn sich der Inhalt der Zwischenablage ändert, fügt diese Funktion das Fenster hinzu, das über WM_DRAWCLIPBOARD benachrichtigt werden soll Nachrichtenfensterkette.
Da das Handle zum nächsten Fenster in der Zwischenablage-Viewer-Kette noch nicht zurückgegeben wurde, sollte die Anwendung die WM_DRAWCLIPBOARD-Nachricht, die sie während des Aufrufs von SetClipboardViewer empfangen hat, nicht übergeben
.
Wenn Sie die Fensterkette aus der Beobachterkette der Zwischenablage entfernen möchten, muss die Anwendung die Memberfunktion ChangeClipboard aufrufen.
#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
Das Betriebssystem sendet eine Reihe von Nachrichten an die Anwendung, z. B. „Linke Taste nach unten“ und „Linke Taste nach oben“ und die Die Anwendung wird die Nachricht schließlich über Methoden wie GetMessage an den Fensterprozess (WndProc [vollständiger Name auf Englisch: Windows-Prozess]) senden, der auf einen Zeiger auf einen von der Anwendung definierten Fensterprozess verweist.
Wir müssen diese Funktion neu schreiben, um das Ereignis zur Änderung des Inhalts der Zwischenablage zu verarbeiten:
#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
Effekt:
Das obige ist der detaillierte Inhalt vonC#-Code zur Implementierung von Windows Clipboard Monitor wird ausführlich vorgestellt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!