使用 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";
}
证明:
现在我正尝试在 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";
}
证明: