Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Verhindern aus einem Memo zu kopieren (https://www.delphipraxis.net/4564-verhindern-aus-einem-memo-zu-kopieren.html)

dopeline 4. Mai 2003 16:27


Verhindern aus einem Memo zu kopieren
 
Hallo!
Gibt es eine Möglichkeit, zu verhindern, dass man den Text aus einem Memo kopieren/ausschneiden kann? Wann ja, wie mache ich das?

Gruß, dopeline :dancer:

Catbytes 4. Mai 2003 16:57

Re: Verhindern aus einem Memo zu kopieren
 
Zitat:

Zitat von dopeline
Hallo!
Gibt es eine Möglichkeit, zu verhindern, dass man den Text aus einem Memo kopieren/ausschneiden kann? Wann ja, wie mache ich das?

Gruß, dopeline :dancer:

Hi Dopeline,

geht gar nicht - also selbst wenn man es per Delphi unterbinden könnte, was ich jetzt direkt nicht weiß, kann ich immer noch ein Screenshot machen und es durch ein Texterkennungsprogramm jagen und habe immer noch die Infos. So mache ich das schon ewig mit geschützten PDF-Dokumenten ;-)

Genau der quatsch mit den geschützen Webseiten - lächerlich. Beim IE einfach Ansicht/Quelltext, dann markieren, kopieren und in meinen HTML-Editor laden - Schutz rausnehmen und anzeigen - bäääääähhhh <zunge_rausstreckt> und schon habe ich dem Webseitenersteller ein Bein gestellt :-)

magicshadow 4. Mai 2003 17:04

Also entweder du sperst die rechte Maustaste, die Menütaste und die Tastenkombinationen STRG+C/STRG+X

oder du bastelst dir einfach einen timer und sagts

Code:
memo1.selstart:=memo1.selstart+memo1.SelLength;
memo1.sellength:=0;
Das soll dann alle 5 ms wiederholt werden und fertig.
(Wer es schafft den text in 0,005 sec. zu markieren und zu copieren, dem sollte man den Ervolg gönnen.)

Ach und wenn man in das Memo nix eingeben können brauch, dann gib es doch einfach über ein
Label aus, da kann man garantiert nix rauscopieren, ob man da aber irgendwie einen schönen 3D Ramen rumbekommt weiß ich nicht. (Das hilft auch gegen Tools, die Den Text eines Memo's anhand des Handels auslesen, ich glaub da gabs probleme den handel eines labels zu ermitteln, über dem die Maus ist.

magicshadow 4. Mai 2003 17:09

Re: Verhindern aus einem Memo zu kopieren
 
Zitat:

Zitat von Catbytes
Genau der quatsch mit den geschützen Webseiten - lächerlich. Beim IE einfach Ansicht/Quelltext, dann markieren, kopieren und in meinen HTML-Editor laden - Schutz rausnehmen und anzeigen - bäääääähhhh <zunge_rausstreckt> und schon habe ich dem Webseitenersteller ein Bein gestellt :-)

Na ja, das mit der Texterkennung bekommt man mit einem dunklen Hindergrund schon hin, und das mit dem queltext, da gibbet schöne java-tools, die die seite mit javascript verschlüsseln. (Aber wofür? Texte schützen, die man zur not auch abtippen kann?)
Interessant wird der schutz von Bildern, aber das ist ein anderes Kapitel ;)

PS: Einen abseluten Schutz gibt es nie, man kann z.b. immer den Speicher auslesen, in dem der Text steht, nur ob man sich diese Mühe machen möchte?

dopeline 4. Mai 2003 17:17

Zitat:

Zitat von magicshadow
Also entweder du sperst die rechte Maustaste, die Menütaste und die Tastenkombinationen STRG+C/STRG+X

Das hört sich ganz brauchbar an, aber wie mache ich das. (Idiotensicher erklärt...) :wink:

und das mit dem Texterkennungsprogramm (z.b. omnipage) kann man sowieso immer machen. aber viele leute wissen nicht einmal, dass es sowas gibt, geschweige denn, wie man das benutzt 8)

Grüße, dopeline

APP 4. Mai 2003 17:28

Hallo,

das kommt darauf an, was Du mit dem Memo vorhast, dient es zur
Dateneingabe, oder soll es nur Text darstellen den Du im Programm
erzeugst. Wenn letzteres der Fall ist, kannst Du das Memo einfach auf
Delphi-Quellcode:
Memo1.Enabled := FALSE;
stellen, trotzdem funktioniert danach noch immer z.B.
Delphi-Quellcode:
Memo1.Lines.Add('test');
aber man kann den Text nicht mehr markieren, daher auch nicht mehr
kopieren. Einzig die Darstellung des Memos ändert sich leicht, Style
disabled, das könnte man sicher auch leicht ändern, wenn es stört.

Christian Seehase 4. Mai 2003 17:35

Moin Dopeline,

erstell Dir ein PopUpMenü mit zwei Menüitems, dem einen weist Du den ShortCut für STRG-C, dem anderen den für STRG-X zu.
Dem Memo wird jetzt dieses PopUpMenü verpasst, und dann im OnContextPopup des Memos die Zeile Handled := true eingetragen.
Fertig.

Dadurch, dass Du die Shortcuts in einem zugewiesenen Menü verwendest, ist Dein Programm selber für deren Ausführung verantwortlich, und durch das Handled := true wird dem System mitgeteilt, dass das Programm auch das Contextmenü selber darstellen will (bzw. hat), was natürlich unterbleibt.

Das herauskopieren mittels WM_GETTEXT funktioniert dann aber immer noch ;-)

magicshadow 4. Mai 2003 17:48

Also zum deaktivieren der rechten Maustaste würde ich dir einfach raten, abzufragen, wann die Maus gedrückt wird (rechte taste) wenn dann Die Maus über dem Memo ist, dann sende einen linksklick.
Beispiele kannst du unter:
Mausklick simulieren:
http://www.tipps.delphi-source.de/de...020914-2.shtml

Maustaste Prüfen:
http://www.tipps.delphi-source.de/sy...020914-4.shtml

Cursorposition ermitteln:

var a:TPoint;
x,y:longint;
begin
GetCursorPos(a);
mausx:=a.x;
mausy:=a.y
...
end;

Das Memo ist im bereich x koordinate: von form1.left+memo1.left bis form1.left+memo1.left+memo1.width
Bereich y koordinate dementsprechen mit top und height (nur das nu noch +17 (Tietelleiste) rechnen mußt.

Aber wie das mit den Tasten war weiß ich jetzt auch nicht mehr so genau, wenn ich was finde, dann sag ich bescheid!

[edit]
Also die STRG+C/X kannst du auch deaktivieren, indem du bei memo1.onkeydown einfach "memo1.sellength:=0;" eingibst. (Wenn also c oder x gedrückt wird wird erst die markierungslänge auf 0 gesetzt, dann copiert.

Und wenn du das auch in nen timer machst kann man auch mit der Menü-Taste von windows nicht mehr copieren, da das menü eine Darstellungsverzögerung von ich glaube 50ms hat-> timer setzt schneller wieder auf nichts markiert, als das menü aufgeht.
[/edit]

Luckie 4. Mai 2003 19:07

Zitat:

Zitat von magicshadow
Also zum deaktivieren der rechten Maustaste würde ich dir einfach raten,

nimm die Lösung die Christian gepostet hat und vergiss die Verränkungen von magicshadow.
Zitat:

Also die STRG+C/X kannst du auch deaktivieren, indem du bei memo1.onkeydown einfach "memo1.sellength:=0;" eingibst. (Wenn also c oder x gedrückt wird wird erst die markierungslänge auf 0 gesetzt, dann copiert.
Auch das wird von Christians Lösung erschlagen. :roll:

Lies doch einfach mal, was schon für Lösungen gepostet wurden, bevor du ihr so unsinnige Vorschläge machst.

dopeline 4. Mai 2003 19:21

Vielen Dank! Das mit dem PopupMenu hat funktioniert. als ich versucht habe den text mit strg+c zu kopieren und dann in einem Editor einzufügen ist dabei nur "Handled := true" rausgekommen! :hello:

Kann man es jetzt noch irgentwie einrichten, dass im Editor nicht "Handled := true" steht, sondern ein Text, wie "Das Kopieren ist nicht gestatten. Alle Rechte sind den Entwicklern vorbehalten" auftaucht? Das wär cool.

Grüße, dopeline :dancer:

ssach 4. Mai 2003 20:01

hy,

denke die beste lösung ist bei onkeydown die laenge des zu selektierneden textes auf 0 setzt!

cu

Luckie 4. Mai 2003 20:11

Zitat:

Zitat von ssach
denke die beste lösung ist bei onkeydown die laenge des zu selektierneden textes auf 0 setzt!

Ich bekomme gleich noch mal einen Anfall. Die beste und einfachste Möglichkeit ist die von Christian! Damit erschlägt man gleich alle Probleme auf einmal: Kein Popupmenü und kein Kopieren/Einfügen möglich.

ssach 4. Mai 2003 20:27

keinen anfall bekommen,

isrt nicht gut fuer die gesundheit!

cu

Catbytes 5. Mai 2003 02:00

Re: Verhindern aus einem Memo zu kopieren
 
Zitat:

Zitat von magicshadow
Na ja, das mit der Texterkennung bekommt man mit einem dunklen Hindergrund schon hin

Und ich mach dann das Bild auf 2 Farben und bekomme schwarz und weiß...

Zitat:

Zitat von magicshadow
und das mit dem queltext, da gibbet schöne java-tools, die die seite mit javascript verschlüsseln.

Mit verschlüsseltem Text kann der Browser nix anfangen. Irgendwann muß der reine HTML-Text an den Browser gesendet werden - da hilft auch die beste Verschlüsselung nichts.

Zitat:

Zitat von magicshadow
(Aber wofür? Texte schützen, die man zur not auch abtippen kann?)
Interessant wird der schutz von Bildern, aber das ist ein anderes Kapitel ;)

Meine Rede...

Zitat:

Zitat von magicshadow
PS: Einen abseluten Schutz gibt es nie, man kann z.b. immer den Speicher auslesen, in dem der Text steht, nur ob man sich diese Mühe machen möchte?

Eben...

Ich verstehe auch nicht, was in einem Memotext so geheimnisvolles stehen sollte? Der Schuß kann auch nach hinten losgehen nach dem Motto: "Was verboten ist, reizt besonders."

Aber um wieder zum "Problem" zurückzukommen:

Ich nehme an, in diesem Formular gibt es auch einen "OK" Button oder sowas ähnliches. Erzeuge einfach im OnEnter-Event der Memo folgenden Code:

Code:
ActiveControl:=Button1;
Und Ruhe ist...

:P

magicshadow 5. Mai 2003 05:39

Aber wenn man in die Memo auch etwas eingeben können soll ist die Möglichkiet enabled:=false; nicht machbar.

Nur nochmal um vom Thema weg zu kommen *G* (@Catbytes)
java verschlüsseler basieren auf einfachen algorythmen, die entweder aus einem Buchstabendurcheinander wieder text machen oder auf eine andere meißt recht simple weise einen text 'entschlüsseln' da dein browser java unterstützt kann dieser den verschlüsselten quelltext bekommen und den extra für dich entschlüsseln, ein copy und past des quelltext ist noch möglich, da dieser aber verschlüsselt ist werden änderungen oder die entnahme von teilen aber recht gut verhindert.

Zu deinem OCR, es gibt kontrastfarben, die beim 1-Bit scannen oder umwandeln beide schwarz, bzw weiß dargestellt werden. Wenn also dein hintergrund und dein Text jeweils eine Farbe haben, die laut 1-bit übersetzung die gleiche näherungsfarbe hat, dann hast du ein 1-farbiges bild. Und da wirst du deinen text nur recht schlecht erkennen lassen können. (Oder gibts da schon Tools für?)

jbg 5. Mai 2003 06:50

Ich hätte dafür das TJvMemo (JVCL) benutzt. Bei der Komponente kann man das Kopieren/Einfügen/Ausschneiden je nach bedarf ein und ausschalten.

Catbytes 5. Mai 2003 07:04

Zitat:

Zitat von magicshadow
(@Catbytes)
java verschlüsseler basieren auf einfachen algorythmen, die entweder aus einem Buchstabendurcheinander wieder text machen oder auf eine andere meißt recht simple weise einen text 'entschlüsseln' da dein browser java unterstützt kann dieser den verschlüsselten quelltext bekommen und den extra für dich entschlüsseln, ein copy und past des quelltext ist noch möglich, da dieser aber verschlüsselt ist werden änderungen oder die entnahme von teilen aber recht gut verhindert.

Wo ein Willi ist, ist auch ein Bier ;-)
Wenn einer an die Daten ran will, kommt er ran - Speicher auslesen z.B.

Zitat:

Zitat von magicshadow
Zu deinem OCR, es gibt kontrastfarben, die beim 1-Bit scannen oder umwandeln beide schwarz, bzw weiß dargestellt werden.

Scannen? Wir reden von Screenshot. Wenn es den trotzdem so sein sollte: Irgendwie _muß_ ein Kontrast da sein (sonst kann ich nix mehr lesen): Mit meinem PSP sprüh ich dann einfach die Farbe dementsprechend um - Werkzeuge dazu habe ich dank PSP genug. Dann in 2 Farben umwandeln und fertig ist der Käse...

magicshadow 5. Mai 2003 15:49

Na ja, lassen wir das Thema mal lieber, sonst vertiefen wir uns hier zusehr. Außerdem bin ich immer der menung, abschreiben ist auch ne möglichkeit, gegen die sowieso nix hilft! (Hat mein Lehrer auch immer gesagt *g*)

Specialwork 5. Mai 2003 16:22

Hallo dopeline,

Die einfachste Möglichkeit ist wohl folgende:

Erstelle Dir die StandardActions zum Kopieren, Ausschneiden und Einfügen. Dann ersetzte die vom Betriebssystem vorgegebenen Shortcuts, also Ctrl+X->Ausschneiden; Ctlr+C->Kopieren, Ctrl+V->Einfügen in den ActionItems.

Dann erzeuge für jede Action einen Einsprungspunkt, indem Du einen Doppelklick auf die Actionitems machst, und schreibe dort eine Kommentarzeile hinein.

Delphi-Quellcode:
procedure TForm1.EditCut1Execute(Sender: TObject);
begin
  //
end;

procedure TForm1.EditCopy1Execute(Sender: TObject);
begin
  //
end;

procedure TForm1.EditPaste1Execute(Sender: TObject);
begin
  //
end;
... und fertig !

Gruß, Tom

dopeline 5. Mai 2003 16:49

Zitat:

Zitat von Specialwork
Erstelle Dir die StandardActions zum Kopieren, Ausschneiden und Einfügen. Dann ersetzte die vom Betriebssystem vorgegebenen Shortcuts, also Ctrl+X->Ausschneiden; Ctlr+C->Kopieren, Ctrl+V->Einfügen

Ähm.. und nun noch mal für den laien bitte :wink:
bin noch newbie auf dem gebiet.

Catbytes 5. Mai 2003 18:37

Hi,

meine Lösung ist wohl etwas untergegangen:

Ich nehme an, in diesem Formular gibt es auch einen "OK" Button oder sowas ähnliches. Erzeuge einfach im OnEnter-Event der Memo folgenden Code:

Code:
ActiveControl:=Button1;

Jens Schumann 6. Mai 2003 07:31

Hallo,
mit folgendem Source sollte das Kopieren aus einem Memo nicht mehr möglich sein.
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ClipBrd, AppEvnts;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    ApplicationEvents1: TApplicationEvents;
    procedure ApplicationEvents1Deactivate(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Memo1Exit(Sender: TObject);
  private
    { Private-Deklarationen }
    FWndProc : TWndMethod;
    procedure MemoWndProc(var Msg: TMessage);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ApplicationEvents1Deactivate(Sender: TObject);
begin
  ClipBoard.Clear; // Anwendungsübergreifendes kopieren verhindern
end;

procedure TForm1.MemoWndProc(var Msg: TMessage);
begin
  if Msg.Msg = WM_GETTEXT then
    begin
    Msg.Result := 1;
    end
      else FWndProc(Msg); // alte Fensterproceure aufrufen
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FWndProc := Memo1.WindowProc; // alte Fensterproceure merken
  Memo1.WindowProc := MemoWndProc; // Fensterproceure auf eigene Fensterprocedure umbiegen
end;

procedure TForm1.Memo1Exit(Sender: TObject);
begin
  ClipBoard.Clear; // Anwendungsinternes kopieren verhindern
end;

end.

Luckie 6. Mai 2003 07:34

Zitat:

Zitat von Jens Schumann
Delphi-Quellcode:
procedure TForm1.Memo1Exit(Sender: TObject);
begin
  ClipBoard.Clear; // Anwendungsinternes kopieren verhindern
end;

Und was ist mit dem Inhalt der Zwischenablage, der aus eien anderen Programm stammt? Den verliere ich nämlich wenn ich deinen Code verwende.

Jens Schumann 6. Mai 2003 07:46

Hallo
Zitat:

Zitat von Luckie
Und was ist mit dem Inhalt der Zwischenablage, der aus eien anderen Programm stammt? Den verliere ich nämlich wenn ich deinen Code verwende.

Ja, das stimmt.
Wenn Du etwas aus einer anderen Anwendung in die eigene Anwendung kopieren willst und beim aktivieren der eigenen Anwendung Memo1 den Focus hat, dann lasse Memo1OnExit einfach weg, wenn Du den Inhalt der ZwA nicht in Memo1 kopieren möchtest.
Wenn Du aus Deiner Anwendung etwas in eine andere Anwendung kopieren möchtest, aber nur nicht aus Memo1 dann schreibe folgendes
Delphi-Quellcode:
procedure TForm1.ApplicationEvents1Deactivate(Sender: TObject);
begin
  If ActiveControl=Memo1 then
    ClipBoard.Clear; // Anwendungsübergreifendes kopieren verhindern
end;

Specialwork 6. Mai 2003 09:56

Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Dopeline,

Im Anhang findest Du ein Demoprojekt, das Dir ein wenig weiterhelfen wird.

Gruß, Tom

:bouncing4:

sakura 6. Mai 2003 10:37

Ich habe den Thread nicht mitverfolgt, aber es hat mich gerade mal in den Fingern gejuckt. Anbei eine kleine Komponente, welche wie das TMemo ist, allerdings copy, cut & paste nicht zulässt. Wenn es passt: schön; wenn nicht: na ja :mrgreen:

Delphi-Quellcode:
unit NoCopyMemo;

interface

uses
  Windows, Messages, StdCtrls;

type
  TNoCopyMemo = class(TMemo)
  private
    procedure WMCOPY(var Msg: TWMCopy); message WM_COPY;
    procedure WMCUT(var Msg: TWMCut); message WM_CUT;
    procedure WMPASTE(var Msg: TWMPaste); message WM_PASTE;
    procedure WMGETTEXT(var Msg: TWMGetText); message WM_GETTEXT;
  end;

implementation

{ TNoCopyMemo }

procedure TNoCopyMemo.WMCOPY(var Msg: TWMCopy);
begin
  Msg.Result := -1;
end;

procedure TNoCopyMemo.WMCUT(var Msg: TWMCut);
begin
  Msg.Result := -1;
end;

procedure TNoCopyMemo.WMGETTEXT(var Msg: TWMGetText);
begin
  if Msg.TextMax >= 5 then
    StrPCopy(Msg.Text, 'doch')
  else
    Msg.TextMax := 5;
  Msg.Result := -1;
end;

procedure TNoCopyMemo.WMPASTE(var Msg: TWMPaste);
begin
  Msg.Result := -1;
end;

end.
...:cat:...

P.S. Damit sind auch die Funktionen des Kontextmenüs inaktiv - auch wenn diese noch angezeigt werden. Das Kopieren und ähnliches läuft i.A. über entsprechende Windowsmessages, welche einfach abgefangen werden können.

Jens Schumann 6. Mai 2003 10:39

Hallo Sakura,
damit ist aber nocht nicht das WM_GETTEXT Problem gelöst.

sakura 6. Mai 2003 10:43

Hi Jens,

ich sag doch, habe nicht alles durchgelesen. Gehts jetzt? Ich habe obiges Beispiel einfach mal angepasst und frech "doch" zurückliefern lassen :mrgreen:

...:cat:...


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:12 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