Benutzer mit den meisten Antworten
Wenn Nutzer einen Text einfügt dann soll was passieren

Frage
Antworten
-
Achso, das sollte einfach sein. Blockiere das Einfügen einfach völlig:
Class MyTextBox Inherits TextBox Const WM_PASTE = &H302 Protected Overrides Sub WndProc(ByRef msg As Message) Select Case msg.Msg Case WM_PASTE 'MyBase.WndProc(msg) 'Einfügen verhindern, indem wir das zu Grund liegende Control nicht über den Einfüge-Befehl benachrichtigen Case Else MyBase.WndProc(msg) End Select End Sub End Class
Wenn du willst, kannst du noch einen kleinen Hinweistext einblenden, sobald WM_PASTE auftritt. (Event in MyTextBox auslösen und in der Form abfaangen und daraufhin den Hinweis ausgeben.)
Wenn du irgend ein anderes Control für die Eingabe nutzt, dort geht es genauso. Die WM_...-Nachrichten werden immer gleich gesendet.
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.- Als Antwort vorgeschlagen WiWo Freitag, 25. Oktober 2013 06:00
- Als Antwort markiert Ionut DumaModerator Dienstag, 29. Oktober 2013 16:26
-
Ich habe es jetzt einfach so gelöst werde aber vielleicht nochmal über deine neue Lösung nachdenken:
If My.Computer.Clipboard.GetText = TextBox1.Text Then If My.Settings.Language = "en" Then MsgBox("We have detected that you have paste anything. You can´t paste the code out of your clipboard. Please try again") Else MsgBox("Wir haben festgestellt, dass Sie etwas eingefügt haben. Sie können das Passwort nicht einfügen. Bitte versuchen Sie es erneut") End If My.Computer.Clipboard.Clear() Else SoundPlay = "1" ' Da kommt dann ein Sound Erweiterte_Optionen.Show() ' Das Fenster was kommen soll End If
- Als Antwort markiert Ionut DumaModerator Dienstag, 29. Oktober 2013 16:26
Alle Antworten
-
Hallo,
ich habe das so verstanden, das du wissen willst, wenn der Benutzer etwas aus der Zwischenablage in deine TextBox einfügt.
Das geht recht einfach über die WinAPI und WndProc. WndProc wird für jede Windows-Nachricht aufgerufen. Erstellt also eine neue Klasse, die von TextBox erbt und überschreibe die Methode. Nun musst du nurnoch nach der WM_PASTE-Nachricht ausschau halten:
Class MyTextBox Inherits TextBox Const WM_PASTE = &H302 Protected Overrides Sub WndProc(ByRef msg As Message) Select Case msg.Msg Case WM_PASTE MsgBox("PASTE") MyBase.WndProc(msg) Case Else MyBase.WndProc(msg) End Select End Sub End Class
Das aufrufen von WndProc der Basisklasse ist wichtig, da du sonst nichteinmal das Fenster erstellen könntest und das Einfügen keine Wirkung hätte.
Wenn du die Zwischenabage dahgegen Systemweit überwachen willst, dann gucke mal hier.
Einen Konverter findest du in meiner Signatur.Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke. -
Entweder bin ich zu blöd oder ich muss schlafen aber ich bekomme dass irgendwie nicht hin also ich habe jetzt die Klasse erstellt in meinem Projekt aber wie kann ich jetzt sagen, dass da dann was Passieren soll.
Also ich beschreibe nochmals besser einmal genau mein Vorhaben.
Der Nutzer gibt etwas in eine Textbox ein und drückt einen Button und alles läuft so wie es laufen soll
Der Nutzer fügt etwas in die Textbox ein und drückt einen Button und dann soll eine MSG auftauchen
Vielleicht hätte ich dass mal vorher sagen sollen. Ich hoffe nicht dass mein Vorhaben jetzt weit von deinem Code abweicht
-
Irgendwie weicht das schon ab.
und dann soll eine MSG auftauchen
Dafür brauchst du nur den Click-Eventhandler für den Button registrieren und dort dann textBox2.Text auswerten.
Ansonsten hast du auch noch das TextChanged-Event, welches bei einer änderung des Textes ausgelöst wird.
Ich habe es so verstanden, das sobald der Benutzer Strg + V (Rechtsklick > Einfügen) drückt, das dann eine Meldung kommen soll.
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke. -
Erstmals sorry, dass ich zuerst vielleicht etwas falsche angaben gemacht habe.
Aber ich finde keinen Punkt in dem Textbox Event wo sowas in die richtig Copy / Paste event geht
Ich möchte nur dann eine Meldung nach klick eines Buttons auslösen wenn der Text auch wirklich aus dem Zwischenspeicher in die Textbox gefügt worden ist ich meine nicht so ein Event wo das Programm einfach prüft ob sich der in der Textbox befindende Text auch in der Zwischenablage befindet, dass kann ich auch selber:
If My.Computer.Clipboard.GetText = TextBox1.Text = True Then 'das True kann ich auch Weglassen ich weiß MsgBox("Mach dir die Mühe und gib es von Hand ein") End If
Also was muss ich da jetzt genau machen habe dass noch nicht so ganz verstanden -
Ein richtiges Clipboard event gibts nicht. Darum ebven mein obiger Code mit den Windows-Meldungen. Sobald man versucht etwas einzufügen wird WM_PASTE an die TextBox gesendet. Danah wird der Text eingefügt. Sobald WM_PASTE eintritt, wird die MsgBox angezeigt.
Wenn du das erst nach einem Button-Click abfragen möchtest, dann setze beim eintreten von WM_PASTE einfach inen Wert auf True und frage diesen im Click-Handler wieder ab.
Aber 1. verstehe ich den Sinn davon nicht, da ein Direkter Vergleich mit der Zwischenablage Sinnvoller wäre [1], wobei auch das für mich keinen Sinn ergibt.
[1] Du würdest erkennen können, ob der Benutzer etwas an dem Wert geändert hat. Weiterhin könnte er ein "T" weg löschen und es an der selben Stelle wieder einfügen. Nun ist der Inhalt der Selbe wie in der Zwischenablage, aber die Programmlogik (wenn du sie weiter führst) würde es als nicht aus der Zwischenablage stammend identifizieren.
Weiterhin kann sich zwischen infügen und dem Click-Handler aber auch die Zwischenablage wieder ändern.Es gibt also mehr Probleme als alles andere, wozu brauchst du das also?
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke. -
Achso, das sollte einfach sein. Blockiere das Einfügen einfach völlig:
Class MyTextBox Inherits TextBox Const WM_PASTE = &H302 Protected Overrides Sub WndProc(ByRef msg As Message) Select Case msg.Msg Case WM_PASTE 'MyBase.WndProc(msg) 'Einfügen verhindern, indem wir das zu Grund liegende Control nicht über den Einfüge-Befehl benachrichtigen Case Else MyBase.WndProc(msg) End Select End Sub End Class
Wenn du willst, kannst du noch einen kleinen Hinweistext einblenden, sobald WM_PASTE auftritt. (Event in MyTextBox auslösen und in der Form abfaangen und daraufhin den Hinweis ausgeben.)
Wenn du irgend ein anderes Control für die Eingabe nutzt, dort geht es genauso. Die WM_...-Nachrichten werden immer gleich gesendet.
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.- Als Antwort vorgeschlagen WiWo Freitag, 25. Oktober 2013 06:00
- Als Antwort markiert Ionut DumaModerator Dienstag, 29. Oktober 2013 16:26
-
Ich habe es jetzt einfach so gelöst werde aber vielleicht nochmal über deine neue Lösung nachdenken:
If My.Computer.Clipboard.GetText = TextBox1.Text Then If My.Settings.Language = "en" Then MsgBox("We have detected that you have paste anything. You can´t paste the code out of your clipboard. Please try again") Else MsgBox("Wir haben festgestellt, dass Sie etwas eingefügt haben. Sie können das Passwort nicht einfügen. Bitte versuchen Sie es erneut") End If My.Computer.Clipboard.Clear() Else SoundPlay = "1" ' Da kommt dann ein Sound Erweiterte_Optionen.Show() ' Das Fenster was kommen soll End If
- Als Antwort markiert Ionut DumaModerator Dienstag, 29. Oktober 2013 16:26
-
SO gehts auch zumindest klappt es:
Private Sub TextBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBox1.KeyDown
e.SuppressKeyPress = e.Control AndAlso (e.KeyCode = Keys.V OrElse _
e.KeyCode = Keys.C OrElse e.KeyCode = Keys.X)
End Sub -
Ich verstehe nicht wie ich die Klasse dann benutzen kann !
Einfach nur die Klasse einfügen, dann die Projektmappe erstellen und aus der Toolbox das Contorl auf die Form ziehen. Also alles so wie bei den Standartcontrols.
PS: Ich arbeite normalerweise nicht mit Klassen die ich erstellen muss
Das solltest diuu aber, wenn du VB.NET irgendwann richtig kennen willst. Es ist nunmal eine OOP-Sprache die fast nur aus Klassen besteht.
> Darum fangen fast alle Programmierbüchern mit Konsolenanwendungen an, denn da kann man sich nicht Tage an Controls aufhalten, weil es einfach keine gibt. GUI ist ein sehr komplexes Thema...was in diesem Fall häufig das Verstehen von OOP verraus setzt.
PS: OOP = Objektorientierte Programmierung:
http://de.wikipedia.org/wiki/Objektorientierte_ProgrammierungKoopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke. -
Rechtsklick - Einfügen - Pech gehabt.
Machs doch einfach mit dem Control und fertig. Ggf. kannst du auch noch WM_COPY und WM_CUT abfangen. Die Codes findest du hier.
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke. -
Hallo Tobpy,
Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
Wenn nicht, neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.Danke und viele Grüße,
IonutIonut Duma, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip„Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.