Forum: PC-Programmierung Qt C++ kopieren nur innerhalb Programm erlauben


von basti (Gast)


Lesenswert?

Hallo

wie kann ich folgendes Problem lösen?

Ich habe ein Programm geschrieben mit einem textwidget.
Ich möchte, dass der User inner halb des Programms die copy and past 
funktion nutzen kann.
ich möchte aber nicht, dass die Kopierten daten außerhalb meines 
Programms zur Verfügung stehen.

Es gibt einige Programme bei denen das so gemacht wurde.
Wie kann ich das realisieren?

Vielen Dank

von Peter II (Gast)


Lesenswert?

ich weiss das es unter windows eine möglichkeit gibt das beim copieren 
nur eine Referenz in die zwischenablage gelegt wird. Beim einfügen wird 
dann erst der Prozess nach den Daten gefragt. Da könnte ich mir 
vorstellen das man es verhindern kann. Eventuell gibt es das ja auch 
unter linux.

von basti (Gast)


Lesenswert?

benötigt wird es für QT unter windows.
hab nur keine vorstellung wie ich das softwaretechnisch lösen kann.

von Peter II (Gast)


Lesenswert?

http://msdn.microsoft.com/en-us/library/ms649051(v=vs.85).aspx

A handle to the data in the specified format. This parameter can be 
NULL, indicating that the window provides data in the specified 
clipboard format (renders the format) upon request. If a window delays 
rendering, it must process the WM_RENDERFORMAT and WM_RENDERALLFORMATS 
messages.


man müssten bei dem event nur noch rausbekommen von welchen Prozess die 
daten angefordert werden.

von basti (Gast)


Lesenswert?

oh je
fühl mich grad wien blutiger anfänger.
Bei Qt ist das alles schön in vorgefertigten methoden verpackt...
da hab ich mich somit noch nie mit der grundmaterie auseinandersetzten 
müssen.

na mal sehn ... ob ich das hinbekomme ?!?!?!

von (Ein) (Gast)


Lesenswert?

Vielleicht nicht das schönste, aber ich meine, dass du auf ein Event 
reagieren könntest, bei dem die Maus das Fenster verlässt.

Kannst du in dem Handler dazu nicht einfach die Zwischenablage löschen? 
(Auch wenn mich so ein Verhalten arg nerven würde, wenn ich etwas dort 
habe, die Maus durch das Fenster bewege und danach alles weg ist. 
Müsstest du also ggf. sichern und dir eine "eigene" Zwischenablage 
schreiben.

von basti (Gast)


Lesenswert?

cool das würde natürlich acuh gehn
...danke für die idee

von Karl H. (kbuchegg)


Lesenswert?

Du kannst natürlich auch ganz einfach ein Renderformat verwenden, dass 
ausser deinem Programm niemand anderer beherrscht. Dann bleiben die 
Daten zwar die ganze Zeit im Clipboard, aber andere Programme können 
damit ganz einfach nichts anfangen.

von basti (Gast)


Lesenswert?

abend Karl Heinz,

das klint interessant, da ich es auch dann für die Speicherung von daten 
verwenden könnte. Kannst du mir sagen, wie ich soetwas programmieren 
müsste?
Vielleicht mit einem Beispiel.

von Karl H. (kbuchegg)


Lesenswert?

Das müsste mit einem Zusammenspiel aus

http://doc.trolltech.com/latest/qclipboard.html

und

http://doc.qt.nokia.com/latest/qmimedata.html

gehen.
Insbesondere im letzten Link den Abschnitt:
"There are three approaches for storing custom data in a QMimeData 
object:"
bzw.
Platform-Specific MIME Types

lesen.

von Karl H. (kbuchegg)


Lesenswert?

PS. Das heißt nicht RenderFormat sondern einfach nur Clipboard Format. 
Nur für den Fall, dass du noch weiter googeln willst.

von basti (Gast)


Lesenswert?

ok schon mal vielen dank,
jetzt weiß ich schon mal nach was ich suchen muss
werd mich morgen mal auf den weg machen

Gut nacht

von Sven P. (Gast)


Lesenswert?

Hat das dann irgendeinen praktischen Nutzwert, außer den Benutzer vom 
Arbeiten abzuhalten?

Sofern QT nativ benutzt wird, kommt man doch gewiss auch über die 
klassische WinAPI an den Inhalt des Textfeldes, wenn man möchte.

von basti (Gast)


Lesenswert?

Hallo,

Die rechte des Nutzers sollen eingeschränkt werden.
Mit dem Programm wird eine Große menge an Daten erstellt.
Das Knowhow und der Fleiß liegt dabei in der Art und weise wie die Daten 
erstellt werden.

Der Nutzer darf kosten los mit dem Programm Daten erstellen und diese im 
Programm bearbeiten, jedoch soll er die durch unser Programm gewonnenen 
Daten nicht in anderen Programmen von anderen Firmen verwenden können.

Die Weitergabe der Daten ist nur an bestimmte Programme per Datenfile 
möglich. Die anderen Programme kosten dann natürlich Geld.

Wenn einer die Daten per hand Abschreibt oder ein Texterkennungsprogramm 
verwendet nutzt der Schutz nichts, aber sicher wird sich keiner der 
Nutzer die Arbeit machen und 1000 Zeilen abschreiben, denn dann könnte 
er die Arbeit der Software auch per hand machen.

von Clipboard (Gast)


Lesenswert?

http://freeclipboardviewer.com/

(Ein) schrieb:
> Vielleicht nicht das schönste, aber ich meine, dass du auf ein Event
> reagieren könntest, bei dem die Maus das Fenster verlässt.
>
> Kannst du in dem Handler dazu nicht einfach die Zwischenablage löschen?
> (Auch wenn mich so ein Verhalten arg nerven würde, wenn ich etwas dort
> habe, die Maus durch das Fenster bewege und danach alles weg ist.
> Müsstest du also ggf. sichern und dir eine "eigene" Zwischenablage
> schreiben.

von Vlad T. (vlad_tepesch)


Lesenswert?

entweder Registrierung eines eigenen Clipboardformat - kann ja trotzdem 
einfach Text sein - möglicherweise auch "verschlüsselter" oder komplett 
eigene Zwischenablage und Unterbindung der Normalen.

Aber prinzipiell finde ich das ganze Vorgehen Schrott. Warum sollte man 
sich als Benutzer so bevormunden lassen?
Ich würde das Programm dann einfach nicht nutzen.  Was nützt es mir, 
wenn es die schönsten Berechnungen macht, ich die Ergebnisse dann aber 
nicht nutzen darf.

von basti (Gast)


Lesenswert?

somit kann man ganz einfach verschiedene Lizensierungsstufen 
realisieren.
Und die eingeschränkte Variante ist nun mal kostenlos.
Ein kaufende Nutzer hat natürlich keine dieser Einschränkungen.

Ganz einfach

von Frank K. (fchk)


Lesenswert?

basti schrieb:
> somit kann man ganz einfach verschiedene Lizensierungsstufen
> realisieren.
> Und die eingeschränkte Variante ist nun mal kostenlos.
> Ein kaufende Nutzer hat natürlich keine dieser Einschränkungen.
>
> Ganz einfach

Und ganz einfach nicht wirksam realisierbar!

QT muss sich auch Windows-Funktionen für die Darstellung der 
Eingabefelder bedienen. Jedes Eingabefeld wird mit Window Messages 
gesteuert und bekommt so seinen Inhalt gesetzt bzw kann darüber seinen 
Inhalt ausgeben. So sind nun einmal die Windows-Mechanismen, und das 
seit Windows 1.0, sprich daran kann niemand mehr etwas ändern, ohne die 
Kompatibilität zum Teufel zu jagen - auch Microsoft nicht. Du kannst das 
Auslesen der Felder nicht verhindern. Punkt.

Ändere Dein Geschäftsmodell!

fchk

von basti (Gast)


Lesenswert?

wie viel Kenntnis braucht man denn um den Inhalt des Textfeldes in der 
Software auszulesen, im Fall, dass die Copy und Paste Funktion 
deaktiviert ist.

von Peter II (Gast)


Lesenswert?

Frank K. schrieb:
> QT muss sich auch Windows-Funktionen für die Darstellung der
> Eingabefelder bedienen. Jedes Eingabefeld wird mit Window Messages
> gesteuert und bekommt so seinen Inhalt gesetzt bzw kann darüber seinen
> Inhalt ausgeben.

nein, es kann auch alles selber machen - bei SWING konnt man auch nichts 
aulesen. Denn man kann einfach text auf den Devicekontect zeichnen.

von Frank K. (fchk)


Lesenswert?

basti schrieb:
> wie viel Kenntnis braucht man denn um den Inhalt des Textfeldes in der
> Software auszulesen, im Fall, dass die Copy und Paste Funktion
> deaktiviert ist.

Es reicht, ein Programm mitlaufen zu lassen, das die Window Messages 
mitprotokolliert. Beim Visual Studio ist zB sowas dabei.

fchk

von Vlad T. (vlad_tepesch)


Lesenswert?

ist halt ne Frage des Preises und der Zielgruppe.
Wenn das Programm 20€ kostet, wird sich keine Firma die Mühe machen, den 
"Schutz" zu umgehen.

Wenn das Programm für beliebige Anwender interessiert ist, findet sich 
auch bei 2,50€ einer, der aus (Ehr)geiz da nen Patch/Crack/Auslesetool 
schreibt.

von basti (Gast)


Lesenswert?

das Programm hat nen wert von ca. 150€ also net so dolle.

wenn sich also jemand die mühe macht und den Crack veröffentlicht, kann 
man den auch finden.
Und aus der Erfahrung von mir bekannten Firmen, weiß ich , dass bei 
einer Klage gegen diese Hoster, welche meist erfogreich ist, viel mehr 
als nur die 150€ rausspringen... soll aber bei uns nicht angewendet 
werden.

Da müssen wir den kopierten Inhalt halt verschlüsseln.
Ist zwar Aufwand , aber was tut man nicht alles für seine Kunden :-)

Aber trotzdem vielen Dank

von Sam .. (sam1994)


Lesenswert?

basti schrieb:
> Und aus der Erfahrung von mir bekannten Firmen, weiß ich , dass bei
> einer Klage gegen diese Hoster, welche meist erfogreich ist, viel mehr
> als nur die 150€ rausspringen... soll aber bei uns nicht angewendet
> werden.

Du willst gegen einen Entschlüsslungsalgorithmus klagen? Na dann viel 
Spaß.

von Εrnst B. (ernst)


Lesenswert?

> ... einer Klage gegen diese Hoster ...

Wenn du schon mit Recht&Gesetz anfängst:

Ich vermute du benutzt die Qt unter LGPL-Lizenz (Unter GPL wär's nix für 
Kommerzielle Software, und für eine 150€ Software lohnt es sich kaum, 
eine teure Lizenz der QT zu kaufen, bzw. die müsstest du bereits gekauft 
haben, bevor du überhaupt mit dem Programmieren angefangen hast).

Dann hat jeder Anwender deiner Software das RECHT, die Qt.DLL in 
deinem Programm auszutauschen. Das DARFST du nicht verhindern.

Und meine QT.DLL hat im Textedit-Kontext-Menu einen Eintrag "Inhalt in 
Textdatei speichern" ;)

von Joe R. (joer)


Lesenswert?

Vielleicht ein Ansatz:

Die Zwischenablage hat viele Formate.
Mach ein eigenes mit verschlüsseltem Text.
Das kannst Du innerhalb Deiner App kopieren da Du es ja dekodieren 
kannst, alle anderen sehen nur Schrott.

von Joe R. (joer)


Lesenswert?

Schreiben in die Zwischenablage

    int i = 50; // wait for 5 sec
    while(i-- && !OpenClipboard(hwnd)) Sleep(100);

    if(!i) return;

    if(!EmptyClipboard()) return;

    // Allocate a global memory object for the text.
    HGLOBAL hglbCopy = GlobalAlloc(GMEM_DDESHARE, (len +1) * 
sizeof(char));
    if (hglbCopy != NULL)
    {
    // Lock the handle and copy the text to the buffer.
    LPTSTR lptstrCopy = (LPTSTR) GlobalLock(hglbCopy);
    CopyMemory(lptstrCopy, content, len);

    lptstrCopy[len] = 0;    // null character
    GlobalUnlock(hglbCopy); // Place the handle on the clipboard.
    SetClipboardData(CF_TEXT, hglbCopy);
    }

    CloseClipboard();

von Vlad T. (vlad_tepesch)


Lesenswert?

Joe Redfish schrieb:
> Vielleicht ein Ansatz:
>
> Die Zwischenablage hat viele Formate.
> Mach ein eigenes mit verschlüsseltem Text.
> Das kannst Du innerhalb Deiner App kopieren da Du es ja dekodieren
> kannst, alle anderen sehen nur Schrott.

dann muss man die QT-Komponenten aber so manipulieren, das die 
Standardmechanismen für Copy+Paste unterdrückt werden.
Damit begibt man sich auf das rechtlich dünne Eis, was ernst eufgezeigt 
hat.

Kan natürlich sein, dass man das auch von außen, also ohne Änderung der 
dlls Unterdrücken kann - glaub ich aber kaum, da Tesxt zu kopieren eine 
ziemlich tief verwurzeltes Feature ist, dass schon jedes standardelement 
der WinApi beherrscht

von Joe R. (joer)


Lesenswert?

Alles QT so lassen, Zwischenablage einfach überschreiben.

Ansonsten würde ich mir es gern anschauen, dann hat das Glaskugelschauen 
ein Ende.

 -> PM

von Slartibartfaß (Gast)


Lesenswert?

Eigenen FormatTyp für die Zwischenablage funktioniert. Die eigene 
Komponente muss hierbei den Handler überschreiben. Hab ich vor Jahren 
schon einmal so in eine Applikation einbauen müssen.
Grund für diese Benutzergängelung - Datenschutz.
So etwas kann auch sinnvoll sein - hier war es ein Programm zur 
Abwicklung von Supportfällen in einem Callcenter. Hier wurden vom 
Auftraggeber "alle" Kundendaten ans Callcenter übergeben - Ein User mit 
einem Problem konnte damit identifiziert werden --- musste nicht noch 
mal seine Adresse komplett durchgeben (Historie ..) usw.
Da dem Auftraggeber aber schon Kundendaten weggekommen sind (ging durch 
die Medien) musste sichergestellt werden das alles dicht war. Auch 
copy&paste.

Gruß
  Slartibartfaß

von Sam .. (sam1994)


Lesenswert?

Slartibartfaß schrieb:
> Eigenen FormatTyp für die Zwischenablage funktioniert.

Kann vielleicht nicht mit Word auslesen, mit einer Programmiersprache 
aber schon.

von Clipboard (Gast)


Lesenswert?

zeigt alles an, speichern inklusive

http://freeclipboardviewer.com/

Samuel K. schrieb:
> Kann vielleicht nicht mit Word auslesen, mit einer Programmiersprache
> aber schon.

von Slartibartfaß (Gast)


Lesenswert?

Na dann halt nur die Objektreferenz in die Zwischenablage. Die Referenz 
enthält dann quasi nur einen Zeiger. Den darf dann auch jeder sehen. Die 
eigene Applikation kann sich dann alle information die sie braucht 
besorgen. Aber mit der Referenz kann von außen keiner von auf den 
Speicher zugreifen (protected).
Da fällt mir noch was ein .... wenn die App. irgend etwas ablegen soll 
wo keiner anderer rankommen soll - bei .NET gibts IsolatedStorage - 
praktisch für Einstellungen vom Programm.

Gruß
  Slartibartfaß

von Sam .. (sam1994)


Lesenswert?

Slartibartfaß schrieb:
> Da fällt mir noch was ein .... wenn die App. irgend etwas ablegen soll
> wo keiner anderer rankommen soll - bei .NET gibts IsolatedStorage -
> praktisch für Einstellungen vom Programm.

Ach und du glaubst der Ram ist vor anderen Programmen sicher? Da gibts 
genügend Tools. Mit einem hab ich mal in einem Spiel gecheated indem ich 
den Ram manipuliert habe. Funktioniert ohne Probleme.

von Simon B. (nomis)


Lesenswert?

Samuel K. schrieb:
> Ach und du glaubst der Ram ist vor anderen Programmen sicher?

Geht es hier nicht eh nur darum, eine halbwegs wirksame Hürde 
aufzubauen? Dass absolute Sicherheit nicht geht ist doch klar. Es geht 
nur darum, es so aufwendig zu machen, dass der Nutzer lieber $$$ 
investiert, statt sich auf eine Reverse-Engineering-Odyssee zu begeben.

Viele Grüße,
        Simon

von Joe R. (joer)


Lesenswert?

Ich meine "Crypten" wäre die Lösung.
Mit einem symmetrischen Verfahren, z.B AES

Der ScreenPrintHandler muss das entschlüsseln wenn er den Bildschirm 
schreiben möchte.
Das steht also nirgendwo als UNICode oder Text im Speicher, nur als 
Bitmap.

von Εrnst B. (ernst)


Lesenswert?

Joe Redfish schrieb:
> Der ScreenPrintHandler muss das entschlüsseln wenn er den Bildschirm
> schreiben möchte.

Und der Mensch, der den Text lesen soll, auch?

Ich weiß ja nicht wie das bei dir ist, aber AES im Kopf entschlüsseln 
kriege ich auch bei bekanntem Key nicht hin.


Gibt aber Windows-Bordmittel um Screenshot&Co zu verhindern, wurden zum 
"Sicheren" BluRay-Abspielen eingeführt. Die App läuft dann halt nur noch 
mit Zertifizierter VGA/Monitor Kombi.

von Sven P. (Gast)


Lesenswert?

Security by obscurity und broken by design, wie immer.

Den Nutzer möglichst weitgehend nerven, einschränken und bei der Arbeit 
behindern, das ist die Devise :-)

von bitte löschen (Gast)


Lesenswert?

Ich mag es eigentlich nicht, so negativ zu schreiben, aber ich habe zu 
viele junge ambitionierte Programmierer (mich selbst eingeschlossen) 
scheitern gesehen, als dass ich die Alarmglocken, die gerade in meinem 
Kopf erklingen, ignorieren könnte. Nimm es also nicht als Beleidigung:

basti schrieb:
> oh je
> fühl mich grad wien blutiger anfänger.

Vielleicht solltest Du Dich mal einfach auf Deine Gefühle verlassen..

> Bei Qt ist das alles schön in vorgefertigten methoden verpackt...
> da hab ich mich somit noch nie mit der grundmaterie auseinandersetzten
> müssen.

Wissen Deine Kunden eigentlich, dass Du programmiertechnisch auf 
Hobbyniveau - sorry - herumfrunzelst?

> na mal sehn ... ob ich das hinbekomme ?!?!?!

Wenn Du Dich eine Weile mit der Windows-API und den MFC beschäftigst, 
noch ein wenig Erfahrung als Entwickler in professionellen Projekten 
sammelst, und dabei mindestens ein mal auf die Nase fällst, bestimmt.

von basti (Gast)


Lesenswert?

oh da hab ich aber eine diskussion angefangen.

Simon Budig schrieb:
> Geht es hier nicht eh nur darum, eine halbwegs wirksame Hürde
> aufzubauen? Dass absolute Sicherheit nicht geht ist doch klar. Es geht
> nur darum, es so aufwendig zu machen, dass der Nutzer lieber $$$
> investiert, statt sich auf eine Reverse-Engineering-Odyssee zu begeben.

Wenigstens einige haben den Sinn verstanden.

Das ich kein Informatiker/ Programmierer bin weiß ich, aber immerhin hat 
man selbst als reiner maschinenbauer einige Programm ideen. Und nen 
professionellen Programmierer zu beauftragen, das lohnt sich für den 
Anfang nicht.

Ich wollte aber gern jedem die möglichkeit geben, das Programm in vollem 
Umfang zu testen. (Niemand will ja die Katze im Sack kaufen.)
Damit es aber nicht als freeware verwendet werden kann, sollte 
verhindert werden, dass der Nutzer die erstellten Daten aus meinem 
Programm in ein anderes Programm zur Weiterverarbeitung kopieren kann.

Das es immer einen Weg gibt ist mir schon klar, aber mir ging es auch 
nur um eine Hürde, so wie Simon Budig das schon gesagt hat.

Trotzdem vielen Dank für die ganzen Hinweise.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.