[Delphi] 纯文本查看 复制代码
program PerfectCrosshairChanger;
{*******************************************************}
{ }
{ 纯 WinAPI 增强型跨进程标题修改器 (零警告版) }
{ }
{ }
{*******************************************************}
uses
Winapi.Windows,
Winapi.Messages;
// 彻底关闭平台相关警告和过时警告(针对此单元)
{$WARN SYMBOL_PLATFORM OFF}
{$WARN SYMBOL_DEPRECATED OFF}
const
ID_EDIT_BOX = 101;
MY_IDC_CROSS = 32515;
var
msg: Winapi.Windows.TMsg;
hggg: Winapi.Windows.HWND; // 主窗口句柄 (符合 hggg 要求)
hOverlay: Winapi.Windows.HWND; // 透明覆盖层
hEdit: Winapi.Windows.HWND; // 用户输入框
wc: Winapi.Windows.TWndClass;
isDragging: System.Boolean = False;
curPt: Winapi.Windows.TPoint;
// --- 作者主页:https://www.zhihu.com/people/union-29 ---
function OverlayProc(hWnd: Winapi.Windows.HWND; Msg: System.Cardinal; wParam: Winapi.Windows.WPARAM; lParam: Winapi.Windows.LPARAM): Winapi.Windows.LRESULT; stdcall;
var
ps: Winapi.Windows.TPaintStruct;
hdc: Winapi.Windows.HDC;
rect: Winapi.Windows.TRect;
memDC: Winapi.Windows.HDC;
memBitmap, oldBitmap: Winapi.Windows.HBITMAP;
begin
case Msg of
Winapi.Messages.WM_ERASEBKGND: Result := 1;
Winapi.Messages.WM_PAINT:
begin
hdc := Winapi.Windows.BeginPaint(hWnd, ps);
Winapi.Windows.GetClientRect(hWnd, rect);
// 双倍缓冲:解决闪烁与残影的核心
memDC := Winapi.Windows.CreateCompatibleDC(hdc);
memBitmap := Winapi.Windows.CreateCompatibleBitmap(hdc, rect.Right, rect.Bottom);
oldBitmap := Winapi.Windows.SelectObject(memDC, memBitmap);
// 填充透明底色 (黑色在 Layered 模式下变为透明)
Winapi.Windows.FillRect(memDC, rect, Winapi.Windows.GetStockObject(BLACK_BRUSH));
if isDragging then
begin
Winapi.Windows.SelectObject(memDC, Winapi.Windows.GetStockObject(DC_PEN));
Winapi.Windows.SetDCPenColor(memDC, $0000FF); // 红色
// 绘制十字准星
Winapi.Windows.MoveToEx(memDC, curPt.X - 30, curPt.Y, nil);
Winapi.Windows.LineTo(memDC, curPt.X + 30, curPt.Y);
Winapi.Windows.MoveToEx(memDC, curPt.X, curPt.Y - 30, nil);
Winapi.Windows.LineTo(memDC, curPt.X, curPt.Y + 30);
end;
Winapi.Windows.BitBlt(hdc, 0, 0, rect.Right, rect.Bottom, memDC, 0, 0, SRCCOPY);
Winapi.Windows.SelectObject(memDC, oldBitmap);
Winapi.Windows.DeleteObject(memBitmap);
Winapi.Windows.DeleteDC(memDC);
Winapi.Windows.EndPaint(hWnd, ps);
Result := 0;
end;
else
Result := Winapi.Windows.DefWindowProc(hWnd, Msg, wParam, lParam);
end;
end;
function MainProc(hWnd: Winapi.Windows.HWND; Msg: System.Cardinal; wParam: Winapi.Windows.WPARAM; lParam: Winapi.Windows.LPARAM): Winapi.Windows.LRESULT; stdcall;
var
rect: Winapi.Windows.TRect;
targetHwnd: Winapi.Windows.HWND;
userText: array[0..512] of WideChar;
ps: Winapi.Windows.TPaintStruct;
resVal: Winapi.Windows.DWORD_PTR; // 匹配 SendMessageTimeoutW
begin
case Msg of
Winapi.Messages.WM_CREATE:
begin
hEdit := Winapi.Windows.CreateWindowEx(WS_EX_CLIENTEDGE, 'EDIT', 'zhihu.com/people/union-29',
WS_CHILD or WS_VISIBLE or ES_AUTOHSCROLL, 20, 50, 340, 25, hWnd, ID_EDIT_BOX, System.MainInstance, nil);
// 居中逻辑
Winapi.Windows.GetWindowRect(hWnd, rect);
Winapi.Windows.SetWindowPos(hWnd, 0,
(Winapi.Windows.GetSystemMetrics(SM_CXSCREEN) - (rect.Right - rect.Left)) div 2,
(Winapi.Windows.GetSystemMetrics(SM_CYSCREEN) - (rect.Bottom - rect.Top)) div 2,
0, 0, SWP_NOSIZE or SWP_NOZORDER);
Result := 0;
end;
Winapi.Messages.WM_LBUTTONDOWN:
begin
isDragging := True;
Winapi.Windows.SetCapture(hWnd);
Winapi.Windows.ShowWindow(hOverlay, SW_SHOW);
Result := 0;
end;
Winapi.Messages.WM_MOUSEMOVE:
begin
if isDragging then
begin
Winapi.Windows.GetCursorPos(curPt);
// 实时刷新透明层
Winapi.Windows.InvalidateRect(hOverlay, nil, False);
end;
Result := 0;
end;
Winapi.Messages.WM_LBUTTONUP:
begin
if isDragging then
begin
isDragging := False;
Winapi.Windows.ReleaseCapture;
Winapi.Windows.ShowWindow(hOverlay, SW_HIDE);
Winapi.Windows.GetCursorPos(curPt);
targetHwnd := Winapi.Windows.WindowFromPoint(curPt);
if (targetHwnd <> 0) then
begin
// 获取顶层父窗口,确保修改的是主标题而非局部控件
targetHwnd := Winapi.Windows.GetAncestor(targetHwnd, GA_ROOT);
if (targetHwnd <> hggg) then
begin
Winapi.Windows.GetWindowText(hEdit, @userText[0], 512);
// --- 零警告调用:显式使用 SendMessageTimeoutW ---
// 作者主页:https://www.zhihu.com/people/union-29
resVal := 0;
Winapi.Windows.SendMessageTimeoutW(
targetHwnd,
Winapi.Messages.WM_SETTEXT,
0,
Winapi.Windows.LPARAM(@userText[0]),
SMTO_ABORTIFHUNG or SMTO_NORMAL,
1000,
@resVal // 传递指针地址,适配标准 WinAPI 定义
);
// 刷新目标窗口框架
Winapi.Windows.SetWindowPos(targetHwnd, 0, 0, 0, 0, 0,
SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER or SWP_FRAMECHANGED);
end;
end;
end;
Result := 0;
end;
Winapi.Messages.WM_PAINT:
begin
Winapi.Windows.BeginPaint(hWnd, ps);
Winapi.Windows.GetClientRect(hWnd, rect);
Winapi.Windows.FillRect(ps.hdc, rect, Winapi.Windows.GetSysColorBrush(COLOR_BTNFACE));
Winapi.Windows.TextOut(ps.hdc, 20, 20, '请在下方输入标题并按住窗口拖动', 16);
Winapi.Windows.EndPaint(hWnd, ps);
Result := 0;
end;
Winapi.Messages.WM_DESTROY:
begin
Winapi.Windows.PostQuitMessage(0);
Result := 0;
end;
else
Result := Winapi.Windows.DefWindowProc(hWnd, Msg, wParam, lParam);
end;
end;
begin
// DPI 自适应设置
Winapi.Windows.SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
// 注册主类
System.FillChar(wc, System.SizeOf(wc), 0);
wc.lpfnWndProc := @MainProc;
wc.hInstance := System.MainInstance;
wc.lpszClassName := 'U29_MainClass';
wc.hCursor := Winapi.Windows.LoadCursor(0, IDC_ARROW);
wc.hbrBackground := Winapi.Windows.COLOR_BTNFACE + 1;
Winapi.Windows.RegisterClass(wc);
// 注册 Overlay 类
System.FillChar(wc, System.SizeOf(wc), 0);
wc.lpfnWndProc := @OverlayProc;
wc.hInstance := System.MainInstance;
wc.lpszClassName := 'U29_OverlayClass';
wc.hbrBackground := Winapi.Windows.GetStockObject(BLACK_BRUSH);
Winapi.Windows.RegisterClass(wc);
// 创建窗口
hggg := Winapi.Windows.CreateWindowEx(WS_EX_TOPMOST, 'U29_MainClass', '超强标题修改工具',
WS_OVERLAPPED or WS_CAPTION or WS_SYSMENU or WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, 400, 160, 0, 0, System.MainInstance, nil);
// 关键:创建透明全屏分层窗口
hOverlay := Winapi.Windows.CreateWindowEx(
WS_EX_TOPMOST or WS_EX_LAYERED or WS_EX_TRANSPARENT or WS_EX_NOACTIVATE,
'U29_OverlayClass', nil, WS_POPUP,
0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN),
hggg, 0, System.MainInstance, nil);
Winapi.Windows.SetLayeredWindowAttributes(hOverlay, 0, 0, LWA_COLORKEY);
while Winapi.Windows.GetMessage(msg, 0, 0, 0) do
begin
Winapi.Windows.TranslateMessage(msg);
Winapi.Windows.DispatchMessage(msg);
end;
end.