How to remove annoying BEEP with RichTextBox

前端 未结 4 1656
星月不相逢
星月不相逢 2021-01-13 19:28

I placed a RichTextBox control on a new form and launched the project. So the RichTextBox.Text = \"\";

Each time I press Up or Down keys I heard the annoying BEEP so

4条回答
  •  失恋的感觉
    2021-01-13 20:09

    first we need send EM_GETOLEINTERFACE message to rich edit window - this is Retrieves an IRichEditOle object that a client can use to access a rich edit control's Component Object Model (COM) functionality.

    then for retrieve an ITextServices pointer, call QueryInterface on the private IUnknown pointer returned by EM_GETOLEINTERFACE.

    here exist interesting point - the IID_ITextServices not well known but need get in runtime from Msftedit.dll

    from About Windowless Rich Edit Controls

    Msftedit.dll exports an interface identifier (IID) called IID_ITextServices that you can use to query the IUnknown pointer for the ITextServices interface.

    after we got ITextServices pointer - we simply can call OnTxPropertyBitsChange(TXTBIT_ALLOWBEEP, 0)

    code example:

        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();
                        }
                    }
                }
            }
        }
    

提交回复
热议问题