MSPaint не получает команды, отправленные через PostCommand

Я пытаюсь вызвать Paint через свою программу и хочу что-то нарисовать

Что я сделал, это — 1. Сначала получить дескриптор для рисования окна (я только порождал этот процесс), затем попытался установить курсор в центр и попытался получить дескриптор для этого конкретного окна. Нет ошибок или предупреждений, я проверил вернуть значения и все, но как-то, вещи не прорисовываются .. Пожалуйста, обратитесь к коду

HWND    hWndPaint = NULL;
HWND    hTempWindow = NULL;BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
int     textLen = 0;
PWSTR   pszMem;

if (!hWnd)
return TRUE;
if (!::IsWindowVisible(hWnd))
return TRUE;

textLen = GetWindowTextLength(hWnd);
pszMem = (PWSTR)VirtualAlloc(NULL, textLen + 1, MEM_COMMIT, PAGE_READWRITE);
GetClassName(hWnd, pszMem, textLen + 1);
if ((_wcsicmp(pszMem, L"MSPaintApp")) == 0)
{
hWndPaint = hWnd;
return TRUE;
}
return TRUE;
}HWND SpawnPaintAndGetDrawHandle()
{
int width = 0, height = 0;

ShellExecute(0, L"open", L"C:\\Windows\\System32\\mspaint.exe", NULL, NULL, SW_SHOWNORMAL);

Sleep(1000);
EnumWindows(EnumWindowsProc, NULL);
if (hWndPaint)
BOOL res = PostMessage(hWndPaint, WM_SYSCOMMAND, SC_MAXIMIZE, 0);

RECT rect;
if (GetWindowRect(hWndPaint, &rect))
{
width = rect.right - rect.left;
height = rect.bottom - rect.top;

SetCursorPos(width / 2, height / 2);
}
POINT   currentCusrsorPoint;
currentCusrsorPoint.x = width / 2;
currentCusrsorPoint.y = height / 2;
return (ChildWindowFromPoint(hWndPaint, currentCusrsorPoint));

}

DWORD MakePosition(WORD x, WORD y)
{
return ((DWORD)y << 16 | (DWORD)x);
}

int main()
{
HWND hDrawArea = NULL;
hDrawArea = SpawnPaintAndGetDrawHandle();

if (hDrawArea == NULL)
{
std::cout << "Could not find the draw area.. something went wrong.";
return 0;
}

// draw something on DarwArea
int         pX = 0, pY = 0;
BOOLEAN     bFirstPoint = true;

for (double i = 0; i < 1; i += 0.1)
{
double radius = 10 * 2 * 3.14 * i;
double x = cos(radius) * 100 * i;
double y = sin(radius) * 100 * i;

pX = (int)x + 300;
pY = (int)y + 300;

if (bFirstPoint)
{
bool res = PostMessage(hDrawArea, WM_LBUTTONDOWN, MK_LBUTTON, MakePosition(pX, pY));
bFirstPoint = false;
}
PostMessage(hDrawArea, WM_MOUSEMOVE, MK_LBUTTON, MakePosition(pX, pY));
PostMessage(hDrawArea, WM_MOUSEMOVE, MK_LBUTTON, MakePosition(pX, pY));
Sleep(100);
}

PostMessage(hDrawArea, WM_LBUTTONUP, MK_LBUTTON, MakePosition(pX, pY));return 0;
}

0

Решение

Проблема с return (ChildWindowFromPoint(hWndPaint, currentCusrsorPoint));

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

    do
{
curParent = ctrlParent;
ctrlParent = ChildWindowFromPoint(curParent, currentCusrsorPoint);
}while(ctrlParent != curParent);

Это дало бы мне окно, которое работает с сообщениями о кликах и способно генерировать результат «рисования».

2

Другие решения


По вопросам рекламы [email protected]