сначала нам нужно отправить 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();
}
}
}
}
}