Как удалить надоедливый звуковой сигнал с RichTextBox - PullRequest
3 голосов
/ 13 января 2011

Я поместил элемент управления RichTextBox в новую форму и запустил проект.Итак, RichTextBox.Text = "";

Каждый раз, когда я нажимаю клавиши «Вверх» или «Вниз», я слышал раздражающий звук BEEP!Как избавиться от этой проблемы?

Использование «e.SuppressKeyPress = true» в методе KeyDown блокирует положение курсора.

Ответы [ 4 ]

2 голосов
/ 28 апреля 2019

сначала нам нужно отправить EM_GETOLEINTERFACE сообщение в окно расширенного редактирования - это извлекает объект IRichEditOle, который клиент может использовать для доступа к функциональности модели компонентов (COM) элемента управления расширенного редактирования.

затем для получения указателя ITextServices вызовите QueryInterface для частного указателя IUnknown, возвращаемого EM_GETOLEINTERFACE.

здесь существует интересный момент - IID_ITextServices не очень известен, но нужно получить во время выполнения от Msftedit.dll

из Об элементах управления Windowless Rich Edit

Msftedit.dll экспортирует идентификатор интерфейса (IID) с именем IID_ITextServices , который можно использовать для запроса указателя IUnknown для интерфейса ITextServices .

после того, как мы получили указатель ITextServices - мы просто можем позвонить OnTxPropertyBitsChange(TXTBIT_ALLOWBEEP, 0)

пример кода:

    if (HMODULE hmodRichEdit = LoadLibrary(L"Msftedit.dll"))
    {
        // create richedit window
        if (HWND hwndRich = CreateWindowExW(0, MSFTEDIT_CLASS, ...))
        {
            if (IID* pIID_ITS = (IID*) GetProcAddress(hmodRichEdit, "IID_ITextServices"))
            {
                IUnknown* pUnk;
                if (SendMessageW(hwndRich, EM_GETOLEINTERFACE, 0, (LPARAM)&pUnk))
                {
                    ITextServices* pTxtSrv;
                    HRESULT hr = pUnk->QueryInterface(*pIID_ITS, (void**)&pTxtSrv);
                    pUnk->Release();
                    if (0 <= hr)
                    {
                        pTxtSrv->OnTxPropertyBitsChange(TXTBIT_ALLOWBEEP, 0);
                        pTxtSrv->Release();
                    }
                }
            }
        }
    }
1 голос
/ 13 января 2011

Ну, вы можете попытаться подавить клавишу только в том случае, если курсор находится в первой строке и клавиша находится вверху, или в последней строке, и клавиша находится внизу или в положении 0, а клавиша оставлена ​​и т. Д.

Тем не менее, именно так ведет себя большинство текстовых полей, и звук задается в настройках вашей операционной системы. Вы получите такой же звуковой сигнал, скажем, в Wordpad или Outlook, если попытаетесь переместить курсор за пределы текстового поля.

0 голосов
/ 29 октября 2014

Этот код ниже должен остановить звуковой сигнал, и работает с обернутым и развернутым текстом:

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.SelectionStart == richTextBox1.TextLength && e.KeyData == Keys.Right ||
        richTextBox1.SelectionStart == 0 && e.KeyData == Keys.Left
    ) e.Handled = true;
}
0 голосов
/ 13 января 2011

Не перемещайте курсор за пределы поля расширенного текста. "Доктор, мне больно, когда я так делаю ..."

...