Tonsignale beim Scrollen in RichTextBox



  • Heute habe ich ein kleines Problem mit dem Scrollen.
    Ich habe ein Programm gemacht, mit dem ich beliebige Dateien HEX anzeigen kann.
    Das Fenster sieht so aus:
    ShowHex
    Es gibt Programme, die HEX anzeigen, aber alle, die ich kenne, lesen immer die komplette Datei ein.
    Bei kleinen Dateien ist das kein Problem, aber bei großen, z.B. ca. 8 GB (eine Image-Datei) geht das mit diesen Programmen nicht.
    Es dauert Minuten, bis die mit dem Leseversuch an die Stelle kommen, wo der Speicher nicht mehr ausreicht o.a. Fehler.
    Mein Programm hat ein Anzeigefenster mit einer bestimmten Anzahl Zeilen, die entsprechen einer Anzahl Bytes.
    Ich muss also nur wissen, bei welchem Offset innerhalb der Datei ich mich bewege, und kann dann diese Anzahl Bytes
    in HEX anzeigen. Dazu lese ich aus der Datei immer nur die wenigen anzuzeigenden Bytes ab dem Offset. Das geht blitzschnell.
    Mittels der Cursor, PageUp, PageDown, Pos1 und End-Tasten sowie dem Maus-Scroll-rad und einem VScroll-Balken kann ich innerhalb der Datei navigieren.
    So weit - so gut - alles klappt, wie gewünscht.
    Wenn ich aber die Crusor- oder Bild-hoch/runter Taste gedrückt halte, kommt immer ein nerviges Tonsignal.
    Hier ein Auszug, wo die Navigations-Tasten abgefragt werden

            //=============================================
            // Prüfen, ob ESC gedrückt & Scroll-Tasten
            //=============================================
            private void richTextBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
            {
                e.IsInputKey = true; // damit es nicht PING macht => Tastaturpuffer leeren
    
                switch (e.KeyCode)
                {
                    case Keys.Escape: Application.Exit(); break;
    
                    case Keys.PageDown: TaPageDown(); break;
                    case Keys.PageUp:   TaPageUp();   break;
    
                    case Keys.Down: TaDown(); break;
                    case Keys.Up:   TaUp();   break;
    
                    case Keys.Home: TaHome(); break;
                    case Keys.End:  TaEnd();  break;
                }
    
              //e.IsInputKey = true; // damit es nicht PING macht => Tastaturpuffer leeren
    
            } // richTextBox1_PreviewKeyDown
    

    Die Ursache könnte aber auch die RichTextBox sein, weil dort nicht geblättert werden darf, ich habe eine feste Größe eingestellt.
    Evtl schimpft der Herr RichText, weil es nach unten oder oben nicht weitergeht.

    Wie kann ich das nervige Tonsignal bei gedrückter Cursortaste o.ä. unterdrücken ?



  • @hkdd sagte in Tonsignale beim Scrollen in RichTextBox:

    Es gibt Programme, die HEX anzeigen, aber alle, die ich kenne, lesen immer die komplette Datei ein.

    Welche kennst Du denn?

    topic: https://answers.microsoft.com/en-us/windows/forum/all/keyboard-beep-when-typing-too-fast/43724e2e-2733-48bb-84db-2978eb968eb2



  • @hkdd sagte in Tonsignale beim Scrollen in RichTextBox:

    Es gibt Programme, die HEX anzeigen, aber alle, die ich kenne, lesen immer die komplette Datei ein.
    Bei kleinen Dateien ist das kein Problem, aber bei großen, z.B. ca. 8 GB (eine Image-Datei) geht das mit diesen Programmen nicht.

    Ich brauche nicht häufig einen Hex-Editor, aber unter Windows ist mein Standardprogramm für sowas HxD (https://mh-nexus.de/en/hxd/). Das liest/schreibt immer nur den Bereich, wo man sich im Editor befindet und kommt daher gut mit beliebig großen Dateien klar. Auch hat das Programm noch nette Features wie dass man damit z.B. auch den Adressraum von laufenden Prozessen oder sogar die rohen Bytes von nicht gemounteten Laufwerken im Hex-Editor bearbeiten kann. Bisher der mächtigste Hex-Editor den ich kenne.

    Vielleicht ist das ja eine Alternative zum Selbststricken 😉



  • @Finnegan
    HxD habe ich mir geholt - es ist wirklich gut - mein erster Eindruck.
    Mit der großen Datei (eine Image-Datei von 8 GB) kommt das Programm gut zurecht.

    Meine Frage war aber, wenn man in einem RichTextBox.Fenster mit der Pfeil-runter-Taste oder der PageDown-Taste nach unten wandert - ob man den dabei zu hörenden Ton programmtechnisch verhindern kann - nicht mit Windows-Änderung. Das geht bei mir natürlich mit einem einfachen Druck auf LAUTSPRECHER=AUS auf meiner Tastatur. Das meine ich mit meiner Frage aber nicht.
    Ich habe bei einem meiner anderen Programme auch eine Scroll-Funktion, da scrolle ich aber kleine Vorschaubilder auf einem Panel -auch da kam so ein Tonsignal. Dort hat bei der PreviewKeyDown-Routine die Anweisung

    e.IsInputKey = true;
    

    für Abhilfe gesorgt. Bei Richtext ist das leider wirkungslos. Ich hoffte, es gibt auch dafür eine Lösung - das hat mit dem HEX-Anzeige Programm nicht unbedingt etwas zu tun - Richtext benutze ich in vielen Programmen und auch dort kommt es zu diesem ungewollten Tonsignal - egal, welchen Inhalt das jeweilige Richtext-Fenster hat.



  • @hkdd sagte in Tonsignale beim Scrollen in RichTextBox:

    @Finnegan
    HxD habe ich mir geholt - es ist wirklich gut - mein erster Eindruck.
    Mit der großen Datei (eine Image-Datei von 8 GB) kommt das Programm gut zurecht.

    Meine Frage war aber, wenn man in einem RichTextBox.Fenster mit der Pfeil-runter-Taste oder der PageDown-Taste nach unten wandert - ob man den dabei zu hörenden Ton programmtechnisch verhindern kann - nicht mit Windows-Änderung.

    Lieder kenne ich mich nicht wirklich mit WPF aus, aber in diesem Stackoverflow-Thread scheint es eine Lösung für dein Problem zu geben. Ich hoffe das hilft weiter, auch wenn es recht umständlich aussieht. Die dritte Antwort dort sieht mir wie die simpelste aus:

    Well, you can try suppressing the key only if the caret is on the first line and the key is up, or on the last line and the key is down or in position 0 and the key is left, etc.

    Ich glaube das bezieht sich darauf, wann man e.SuppressKeyPress = true setzt und wann nicht - wie gesagt, nicht mein Fachgebiet.



  • @Finnegan
    TOLL - das ist die Lösung, ich habe noch die Abfrage auf PageUp und PageDown ergänzen müssen. Right und Left spielt bei mir keine Rolle, kann aber nicht schaden

            //=============================================
            // Ausgabe von Tonsignal unterbinden
            //=============================================
            private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
            {
                if (richTextBox1.GetLineFromCharIndex(richTextBox1.SelectionStart) == 0 && e.KeyData == Keys.Up ||
                    richTextBox1.GetLineFromCharIndex(richTextBox1.SelectionStart) == richTextBox1.GetLineFromCharIndex(richTextBox1.TextLength) && e.KeyData == Keys.Down ||
                    richTextBox1.GetLineFromCharIndex(richTextBox1.SelectionStart) == 0 && e.KeyData == Keys.PageUp ||
                    richTextBox1.GetLineFromCharIndex(richTextBox1.SelectionStart) == richTextBox1.GetLineFromCharIndex(richTextBox1.TextLength) && e.KeyData == Keys.PageDown ||
                    richTextBox1.SelectionStart == richTextBox1.TextLength && e.KeyData == Keys.Right ||
                    richTextBox1.SelectionStart == 0 && e.KeyData == Keys.Left
                   ) 
                    e.Handled = true;
            } // richTextBox1_KeyDown
    

    Es geht aber noch einfacher, wenn man diesen Warnton generell nicht haben will, dann kann man die IF-Abfrage weglassen.

            //=============================================
            // Ausgabe von Tonsignal unterbinden
            //=============================================
            private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
            {
                    e.Handled = true;
            }
    

    Nochmals DANKE für diesen Hinweis.


Log in to reply