Отрисовка GDI на внешний windows (C ++) - PullRequest
0 голосов
/ 25 мая 2020

Задача состоит в том, чтобы нарисовать на внешнем windows например линию до запущенного окна. (Вроде как ESP для игр).

У меня есть этот код для рисования на рабочем столе (dr aws прямоугольник), но как мне изменить его, чтобы он рисовал в окне по моему выбору?

Код для вывода на рабочий стол:

#include <iostream>
#include <Windows.h>

int main() {

/* hide console window */
ShowWindow(FindWindowA("ConsoleWindowClass", NULL), false);

/* Calling GetDC with argument 0 retrieves the desktop's DC */
HDC hDC_Desktop = GetDC(0);

/* Draw a simple blue rectangle on the desktop */
RECT rect = { 20, 20, 200, 200 };
HBRUSH blueBrush = CreateSolidBrush(RGB(0, 0, 255));
FillRect(hDC_Desktop, &rect, blueBrush);

Sleep(10);
return 0;
}

1 Ответ

0 голосов
/ 26 мая 2020

Когда внешнее окно перерисовывается, нарисованный вами прямоугольник исчезнет. Если вы хотите, чтобы прямоугольник не исчезал при обновлении окна, следуйте предложению @ llspectable.

Вы можете добавить стиль WS_EX_LAYERED , чтобы сделать окно многоуровневым.

Если если вы хотите сделать что-то за многослойным окном, вы можете добавить WS_EX_TRANSPARENT для прозрачности.

Вот код, на который вы можете ссылаться.

#include <Windows.h>
#include <stdio.h>
#include <iostream>

using namespace std;


LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{
    PAINTSTRUCT ps;
    HDC hdc;
    RECT rect;
    switch (message)
    {
    case WM_PAINT:
    {
        hdc = BeginPaint(hwnd, &ps);
        RECT rect = { 0, 0, 200, 200 };
        HBRUSH blueBrush = CreateSolidBrush(RGB(0, 0, 255));
        FillRect(hdc, &rect, blueBrush);
        EndPaint(hwnd, &ps);
    }
    break;
    case WM_SIZE:
    {
        HWND notepad = (HWND)0x00060BA6; //Test window
        GetWindowRect(notepad, &rect);

        float m = (200.0 / 1920.0);
        float n = (200.0 / 1040.0);

        int wh = (rect.right - rect.left) * m;
        int ht = (rect.bottom - rect.top) * n;

        int x = 100 * m;
        int y = 100 * n;

        SetWindowPos(hwnd, HWND_TOPMOST, x+rect.left, y+rect.top, wh, ht, SWP_SHOWWINDOW);
    }
    break;
    case WM_DESTROY:
    {
        PostQuitMessage(0);
        return 0;
    }
    }
    return DefWindowProc(hwnd, message, wParam, lParam);   
};

HINSTANCE hinst;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevinstance, PSTR szCmdLine, int iCmdShow) {
    HWND hwnd;

    hinst = GetModuleHandle(NULL);
    // create a window class:
    WNDCLASS wc = {};
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hinst;
    wc.lpszClassName = L"win32";

    // register class with operating system:
    RegisterClass(&wc);

    // create and show window:
    hwnd = CreateWindowEx(WS_EX_LAYERED| WS_EX_TRANSPARENT, L"win32", L"My program", WS_POPUP &~WS_BORDER, 0, 0, 0, 0, NULL, NULL, hinst, NULL);

    SetLayeredWindowAttributes(hwnd, NULL, 255, LWA_ALPHA);
    if (hwnd == NULL) {
        return 0;
    }

    ShowWindow(hwnd, SW_SHOW);


    MSG msg = {};

    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

}

Примечание: если вы хотите, чтобы многоуровневое окно вместе следовало определенному c внешнему окну, то вам необходимо обрабатывать сообщение WM_SIZE отдельно. Если у вас есть другие вопросы, дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...