2016-07-01 14 views
4

Ich habe ein Problem. Ich versuche, den ClipboardMonitor für meine C# -Anwendung zu verwenden. Ziel ist es, jede Änderung in der Zwischenablage zu überwachen. Beim Start zu überwachen:Clipboard Monitor

AddClipboardFormatListener(this.Handle); 

, wenn der Zuhörer zu stoppen:

RemoveClipboardFormatListener(this.Handle); 

und die Überschreibungsmethode:

const int WM_DRAWCLIPBOARD = 0x308; 
const int WM_CHANGECBCHAIN = 0x030D; 

protected override void WndProc(ref Message m) 
{ 
    switch (m.Msg) 
    { 
     case WM_DRAWCLIPBOARD: 
      IDataObject iData = Clipboard.GetDataObject(); 
      if (iData.GetDataPresent(DataFormats.Text)) 
      { 
       ClipboardMonitor_OnClipboardChange((string)iData.GetData(DataFormats.Text)); 
      } 
      break; 

     default: 
      base.WndProc(ref m); 
      break; 
    } 
} 

und natürlich die DLL-Import:

[DllImport("user32.dll", SetLastError = true)] 
[return: MarshalAs(UnmanagedType.Bool)] 
private static extern bool AddClipboardFormatListener(IntPtr hwnd); 

[DllImport("user32.dll", SetLastError = true)] 
[return: MarshalAs(UnmanagedType.Bool)] 
private static extern bool RemoveClipboardFormatListener(IntPtr hwnd); 

Aber beim Setzen eines Breakpoints beim Methodenaufruf ClipboardMonitor_OnClipboardChange und dem Wechsel der Zwischenablage komme ich nie dazu.

+0

Was die Methode tun 'AddClipboardFormatListener' zurück, wenn Sie es nennen? – AgentFire

+0

Sind Sie sicher, dass Sie die Zwischenablage innerhalb des Handles ändern, das Sie an AddClipBoardFormatListener übergeben? –

Antwort

5

Das Problem ist, dass Sie die falsche Fenstermeldung behandeln. Zitiert in der Dokumentation zu AddClipboardFormatListener:

Wenn ein Fenster in die Zwischenablage Format Hörer Liste hinzugefügt wurde, wird es veröffentlicht eine WM_CLIPBOARDUPDATE Nachricht, wenn der Inhalt der Zwischenablage geändert haben.

Mit diesem Wissen, ändern Sie den Code:

const int WM_CLIPBOARDUPDATE = 0x031D; 
protected override void WndProc(ref Message m) 
{ 
    switch (m.Msg) 
    { 
     case WM_CLIPBOARDUPDATE: 
      IDataObject iData = Clipboard.GetDataObject(); 
      if (iData.GetDataPresent(DataFormats.Text)) 
      { 
       string data = (string)iData.GetData(DataFormats.Text); 
      } 
      break; 


     default: 
      base.WndProc(ref m); 
      break; 
    } 
} 
+0

Auch eine Randnotiz wert, wenn Sie den Format-Listener hinzufügen, (1) Registrieren Sie sich im 'Form.HandleCreated'-Ereignis, so dass Sie ein gültiges' HWND' haben und (2) überprüfen Sie den Rückgabewert von 'AddClipboardFormatListener' um sicherzustellen, dass der Anruf erfolgreich war. – theB

+0

Zuerst, danke für die Antwort! Es funktioniert jetzt gut, aber in der Dokumentation von Microsoft ist es wie folgt definiert: WM_CLIPBOARDUPDATE 0x031D auf dieser Seite: https://msdn.microsoft.com/en-us/library/windows/desktop/ms649021.aspx –

+1

Das gleiche. Ich habe einfach die führende 0 weggelassen, da sie den Wert nicht ändert. Ich werde es so ändern, dass es genau mit der Dokumentation übereinstimmt. – theB