使用 gdiplus 绘制叠加层

Drawing Overlays with gdiplus

现在我正尝试在 gdiplus 中绘制覆盖图,但是当我启动我的程序时它能够找到我们的 window 但它不会绘制我的覆盖线。我错过了什么吗?文档表明我应该能够做到这一点。

#include <windows.h>
#include <objidl.h>
#include <gdiplus.h>
#include <iostream>

using namespace Gdiplus;
#pragma comment (lib,"Gdiplus.lib")




VOID OnPaint(HDC hdc)
{
    Graphics graphics(hdc);
    Pen pen(Color(255, 0, 0, 0), 5);
    graphics.DrawLine(&pen, 0, 0, 200, 100);
}
ULONG_PTR gdiplusToken;

int main() {

    //Untitled - Notepad
    HWND hWnd = FindWindow(NULL, TEXT("*Untitled - Notepad"));
    // In top of main
    GdiplusStartupInput gdiplusStartupInput;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
    if (hWnd == 0) {
        std::cout << "[-] - Unable to locate window!\n";
        return 0;
    }
    std::cout << "[+] - Located Window, starting hook.\n";
    HDC hdc = GetDC(FindWindowA(NULL, "*Untitled - Notepad"));
    PAINTSTRUCT ps;
    hdc = BeginPaint(hWnd, &ps);
    if (hdc == ERROR) {
        std::cout << "[-] - An error occured\n";
        return 0;
    }
    OnPaint(hdc);
    Sleep(3000);
    EndPaint(hWnd, &ps);
    std::cout << "Finished Drawing\n";

}

您未接来电 GdiplusStartup

此外,去掉 BeginPaint 和 EndPaint 调用。这只会擦除 window,这样您就看不到您画的东西了。

这是有效的:

#include <windows.h>
#include <objidl.h>
#include <gdiplus.h>
#include <iostream>

using namespace Gdiplus;
#pragma comment (lib,"Gdiplus.lib")
VOID OnPaint(HDC hdc)
{
    Graphics graphics(hdc);
    Pen pen(Color(255, 0, 0, 0), 5);
    graphics.DrawLine(&pen, 0, 0, 200, 100);
}

int main() {


    // GDI+ startup incantation
    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    //Untitled - Notepad
    HWND hWnd = FindWindow(NULL, TEXT("Untitled - Notepad"));
    if (hWnd == 0) {
        std::cout << "[-] - Unable to locate window!\n";
        return 0;
    }
    std::cout << "[+] - Located Window, starting hook.\n";
    HDC hdc;
    hdc = GetDC(hWnd);
    std::cout << hdc;
    OnPaint(hdc);
    std::cout << "Finished Drawing\n";

}

证明: