Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Sonstiges (https://www.delphipraxis.net/45-library-sonstiges/)
-   -   Delphi Clipboard Viewer (https://www.delphipraxis.net/64884-clipboard-viewer.html)

sakura 9. Mär 2006 14:37


Clipboard Viewer
 
Liste der Anhänge anzeigen (Anzahl: 1)
Immer wieder kommt hier die Frage auf, wie man überwachen kann, ob und wann sich der Inhalt der Zwischenablage ändert. Und da ich heute genau das brauchte, nahm ich mir die Freiheit dieses mal als Delphi-App für die Code-Library aufzubereiten.

Theorie:

Das Fenster, welches sich in die Liste derere einreihen möchte, die das Clipboard beobachten, muss sich mittels MSDN-Library durchsuchenSetClipboardViewer registrieren. Als Ergebnis erhalten wir das Handle des nächsten Beobachterfensters. Gibt es keines, so ist das Ergebnis 0. Schlägt der Aufruf fehl, so ist das Ergebnis auch 0 :shock: Also mit MSDN-Library durchsuchenGetLastError testen, ob es nicht doch korrekt ist.

Wenn das Fenster nicht mehr beobachten will bzw. (ganz wichtig), wenn das Fenster geschlossen wird, so muss MSDN-Library durchsuchenChangeClipboardChain aufgerufen werden.

Des Weiteren müssen noch 2 Windows-Botschaften abgearbeitet werden, welche nur dann aufgerufen werden, wenn wir uns auch im ersten Schritt als Beobachter angemeldet haben: MSDN-Library durchsuchenWM_CHANGECBCHAIN und MSDN-Library durchsuchenWM_DRAWCLIPBOARD

Hier mal die wichtigsten Teile des Codes, das komplette Beispiel findet Ihr als Download im Anhang.
Delphi-Quellcode:
procedure TfrmClpBrdVw.WMChangeCBChain(var Msg: TWMChangeCBChain);
begin
  if Msg.Remove = FNextViewer then
  begin
    FNextViewer := Msg.Next;
    Msg.Result := 0;
  end
  else
  begin
    if (FNextViewer <> 0) and (FNextViewer <> INVALID_HANDLE_VALUE) then
      Msg.Result := SendMessage(FNextViewer, WM_CHANGECBCHAIN, TMessage(Msg).WParam, TMessage(Msg).LParam);
  end;
end;

procedure TfrmClpBrdVw.WMDrawClipboard(var Msg: TWMDrawClipboard);
begin
  lblDateTime.Caption := DateTimeToStr(Now);
  if ClpBrd.HasFormat(CF_TEXT) then
  begin
    mmoClipbrdContents.Text := ClpBrd.AsText;
  end
  else
  begin
    mmoClipbrdContents.Text := '';
  end;
 
  if (FNextViewer <> 0) and (FNextViewer <> INVALID_HANDLE_VALUE) then
    Msg.Result := SendMessage(FNextViewer, WM_DRAWCLIPBOARD, TMessage(Msg).WParam, TMessage(Msg).LParam);
end;

procedure TfrmClpBrdVw.AttachToClipboard;
begin
  if FNextViewer = INVALID_HANDLE_VALUE then
  begin
    FNextViewer := SetClipboardViewer(Handle);
    if FNextViewer = 0 then
      if GetLastError <> 0 then
        ShowMessage(LastErrorMsgStr);
  end;
end;

procedure TfrmClpBrdVw.DetachFromClipboard;
begin
  if FNextViewer <> INVALID_HANDLE_VALUE then
  begin
    ChangeClipboardChain(Handle, FNextViewer);
    FNextViewer := INVALID_HANDLE_VALUE;
  end;
end;
Danke an unseren Nutzer Benedikt für Hinweise zu 0 und INVALID_HANDLE_VALUE ;)

...:cat:...


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz