別のプロセスからリッチエディット コントロール (クラス RichEdit20W) 内の特定の単語の背景色と前景色を設定しようとしています。Python を使用して呼び出す次の C コードがありますが、失敗します (SendMessage は 0 を返します)。SCF_SELECTION を SFC_ALL または 0 に変更すると機能しますが、コントロール内のテキストの一部に変更を適用するだけでよいため、残念ながら私のニーズには合いません。
コードは次のとおりです。
#include <Windows.h>
#include <stdio.h>
#include <limits.h>
#include <Richedit.h>
__declspec(dllexport) LRESULT SetColour(HWND hWnd, COLORREF textColor, COLORREF bgColor)
{
CHARRANGE cr;
cr.cpMin = 3;
cr.cpMax = 8;
CHARFORMAT2 cf;
cf.cbSize = sizeof(cf);
cf.dwMask = CFM_COLOR | CFM_BACKCOLOR;
cf.crTextColor = textColor;
cf.crBackColor = bgColor;
DWORD dwPID;
HANDLE hProcess;
LPVOID pRemoteCR;
LPVOID pRemoteCF;
SIZE_T zWritten;
LRESULT lResult;
GetWindowThreadProcessId(hWnd, &dwPID);
hProcess = OpenProcess(PROCESS_VM_WRITE | PROCESS_VM_OPERATION, FALSE, dwPID);
// Allocate memory on the target process & write the CHARFORMAT2 structure there
pRemoteCR = VirtualAllocEx(hProcess, NULL, sizeof cr, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess, pRemoteCR, &cr, sizeof cr, &zWritten);
SendMessage(hWnd, EM_EXSETSEL, 0, (LPARAM)pRemoteCR);
VirtualFreeEx(hProcess, pRemoteCR, 0, MEM_RELEASE);
pRemoteCF = VirtualAllocEx(hProcess, NULL, sizeof cf, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess, pRemoteCF, &cf, sizeof cf, &zWritten);
lResult = SendMessage(hWnd, EM_SETCHARFORMAT, (WPARAM)SCF_SELECTION, (LPARAM)pRemoteCF); // SCF_SELECTION
VirtualFreeEx(hProcess, pRemoteCF, 0, MEM_RELEASE);
return lResult;
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD dwReason,LPVOID lpvReserved)
{
return TRUE;
}