AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Clipboard Viewer

Ein Thema von sakura · begonnen am 9. Mär 2006
Antwort Antwort
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#1

Clipboard Viewer

  Alt 9. Mär 2006, 15:37
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 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

......
Angehängte Dateien
Dateityp: zip clipboardviewer_145.zip (219,5 KB, 375x aufgerufen)
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Antwort Antwort

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:34 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