vb6richtextboxkeypressbeepsystem-sounds

VB6 Disable system beep sound when arrow up/down is pressed inside rich text box?


I have a Rich Text Box control. It has no scroll bars, cause I am using Mouse Wheel module to capture Mouse Wheel events.

When the rich text box is selected and mouse wheel is rotated up/down it sends keys {UP} and {DOWN} to they rich text box to "mimic" the scroll effect.

However, when you are at the beginning or at the ending of the text box content (e.g there's nothing to scroll anymore), there's annoying beep system sound playing. I need to disable this, any ideas how to do that ?

Already tried adding this code in the rich text box's keypress event:

If KeyAscii = 38 Or KeyAscii = 40 Then
KeyAscii = 0
End If

Doesn't work. Don't know why it just doesn't work when it is supposed to be working.


Solution

  • Use the KeyDown event instead of KeyPress, and disable the KeyCode only if the cursor is located at the first/last line to prevent disabling the arrow keys (up/down) completely.

    First you need to add the following to the declarations:

    Private Declare Function SendMessage Lib "USER32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
    Private Const EM_LINEFROMCHAR = &HC9
    Private Const EM_GETLINECOUNT = &HBA
    
    Private Function GetCurrentLine(Txt As RichTextBox) As Long
        GetCurrentLine = SendMessage(Txt.hWnd, EM_LINEFROMCHAR, Txt.SelStart, 0&) + 1
    End Function
    
    Private Function GetLineCount(Txt As RichTextBox) As Long
        GetLineCount = SendMessage(Txt.hWnd, EM_GETLINECOUNT, 0&, 0&)
    End Function
    

    Then use the KeyDown event as described:

    Private Sub RichTextBox1_KeyDown(KeyCode As Integer, Shift As Integer)
        If KeyCode = vbKeyUp Then
            If GetCurrentLine(RichTextBox1) = 1 Then KeyCode = 0
        ElseIf KeyCode = vbKeyDown Then
            If GetCurrentLine(RichTextBox1) = GetLineCount(RichTextBox1) Then KeyCode = 0
        End If
    End Sub
    

    Of course you'll need to replace RichTextBox1 with the name of your RichTextBox.

    Hope that helps :)