none
Wenn Nutzer einen Text einfügt dann soll was passieren RRS feed

  • Frage

  • Hallo,

    Ich möchte, dass wenn ein Nutzer einen kopierten Text einfügt dass dann das Programm merkt, dass der Text eingefügt worden ist und etwas anzeigt z.B. eine MSGbox

    wie mache ich sowas ???

    Donnerstag, 24. Oktober 2013 19:38

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
    Donnerstag, 24. Oktober 2013 21:48
    Moderator
  • 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

    Freitag, 25. Oktober 2013 16:23

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.

    Donnerstag, 24. Oktober 2013 20:17
    Moderator
  • 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 

    Donnerstag, 24. Oktober 2013 20:33
  • 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.

    Donnerstag, 24. Oktober 2013 20:47
    Moderator
  • 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 
    Donnerstag, 24. Oktober 2013 20:54
  • 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.

    Donnerstag, 24. Oktober 2013 21:26
    Moderator
  • Ich möchte es bei meiner Passwort abfrage benutzen, der Nutzer soll das Passwort selber eingeben und nicht irgendwo her kopieren
    Donnerstag, 24. Oktober 2013 21:33
  • 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
    Donnerstag, 24. Oktober 2013 21:48
    Moderator
  • 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

    Freitag, 25. Oktober 2013 16:23
  • Ich verstehe nicht wie ich die Klasse dann benutzen kann !

    PS: Ich arbeite normalerweise nicht mit Klassen die ich erstellen muss

    • Bearbeitet Tobpy Freitag, 25. Oktober 2013 16:38
    Freitag, 25. Oktober 2013 16:37
  • 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

    Freitag, 25. Oktober 2013 16:42
  • 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_Programmierung


    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.

    Freitag, 25. Oktober 2013 16:43
    Moderator
  • 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.

    Freitag, 25. Oktober 2013 17:05
    Moderator
  • 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,
    Ionut


    Ionut Duma, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-PrinzipEntwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 29. Oktober 2013 16:26
    Moderator