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
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.
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.
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 ?!?!?!
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.
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.
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.
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.
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.
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.
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.
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
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
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.
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
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.
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
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ß.
> ... 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" ;)
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.
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();
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
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ß
Slartibartfaß schrieb:> Eigenen FormatTyp für die Zwischenablage funktioniert.
Kann vielleicht nicht mit Word auslesen, mit einer Programmiersprache
aber schon.
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ß
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.
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
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.
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.
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 :-)
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.
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.