[C++] 纯文本查看 复制代码
#include <Windows.h>
bool allowDrawing = true;
POINT lastMousePos = { 0 };
#define WS_EX_LAYERED 0x80000
#define WS_EX_TRANSPARENT 0x20
#define GWL_EXSTYLE -20
#define LWA_ALPHA 0
int previousStyle;
void MakeWindowExTransparent(HWND hWnd) {
// 获取当前窗口样式
previousStyle = GetWindowLong(hWnd, GWL_EXSTYLE);
// 设置窗口样式,使窗口透明并支持鼠标穿透
SetWindowLong(hWnd, GWL_EXSTYLE, previousStyle | WS_EX_LAYERED | WS_EX_TRANSPARENT);
// 设置窗口透明度
SetLayeredWindowAttributes(hWnd, 0, 100, LWA_ALPHA);
}
void RestoreWindowStyle(HWND hWnd) {
// 恢复之前的窗口样式
SetWindowLong(hWnd, GWL_EXSTYLE, previousStyle);
// 将窗口透明度恢复为不透明
SetLayeredWindowAttributes(hWnd, 0, 255, LWA_ALPHA);
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
case WM_CLOSE: {
PostQuitMessage(0);
return 0;
}
case WM_HOTKEY: {
allowDrawing = !allowDrawing;
if (!allowDrawing) {
MakeWindowExTransparent(hwnd);
}
else {
RestoreWindowStyle(hwnd);
}
return 0;
}
case WM_LBUTTONDOWN: {
lastMousePos.x = LOWORD(lParam);
lastMousePos.y = HIWORD(lParam);
return 0;
}
case WM_MOUSEMOVE: {
if (allowDrawing && wParam & MK_LBUTTON) {
HDC hdc = GetDC(hwnd);
HPEN hpen = CreatePen(PS_SOLID, 3, RGB(255, 0, 0));//实线
HPEN oldhpen = (HPEN)SelectObject(hdc, hpen);
MoveToEx(hdc, lastMousePos.x, lastMousePos.y, NULL);
LineTo(hdc, LOWORD(lParam), HIWORD(lParam));
SelectObject(hdc, oldhpen);//恢复先前画笔
DeleteObject(hpen);
ReleaseDC(hwnd, hdc);
lastMousePos.x = LOWORD(lParam);
lastMousePos.y = HIWORD(lParam);
}
return 0;
}
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
const wchar_t CLASS_NAME[] = L"Sample Window Class";
WNDCLASS wc = { };
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
RegisterClass(&wc);
HWND hwnd = CreateWindowEx(NULL, CLASS_NAME, L"Paint", WS_POPUP, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), NULL, NULL, hInstance, NULL);
if (hwnd == NULL) {
return 0;
}
// 注册热键
RegisterHotKey(hwnd, 1, MOD_CONTROL | MOD_SHIFT, 'P');
ShowWindow(hwnd, nCmdShow);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
// 注销热键
UnregisterHotKey(hwnd, 1);
return 0;
}