本帖最后由 laomms 于 2022-3-4 18:29 编辑
最后一篇讲的是右小角的水印。这个相对简单,没什么好讲的。就贴一些代码吧。
Windows桌面右下角分两种。一种是画出来的,如上面的第一个图,另一种是在桌面插入一个水印层,如上面的第二个图。桌面总共分18个层,又叫ZBID序。下图那个图在ZBID_GENUINE_WINDOWS层:
- enum ZBID
- {
- ZBID_DEFAULT = 0,
- ZBID_DESKTOP = 1,
- ZBID_UIACCESS = 2,
- ZBID_IMMERSIVE_IHM = 3,
- ZBID_IMMERSIVE_NOTIFICATION = 4,
- ZBID_IMMERSIVE_APPCHROME = 5,
- ZBID_IMMERSIVE_MOGO = 6,
- ZBID_IMMERSIVE_EDGY = 7,
- ZBID_IMMERSIVE_INACTIVEMOBODY = 8,
- ZBID_IMMERSIVE_INACTIVEDOCK = 9,
- ZBID_IMMERSIVE_ACTIVEMOBODY = 10,
- ZBID_IMMERSIVE_ACTIVEDOCK = 11,
- ZBID_IMMERSIVE_BACKGROUND = 12,
- ZBID_IMMERSIVE_SEARCH = 13,
- ZBID_GENUINE_WINDOWS = 14,
- ZBID_IMMERSIVE_RESTRICTED = 15,
- ZBID_SYSTEM_TOOLS = 16,
- //Windows 10+
- ZBID_LOCK = 17,
- ZBID_ABOVELOCK_UX = 18
- };
复制代码 先讲预览水印,既然是画的,就会用到ExtTextOutW函数,去掉这个水印就非常简单了,只要拦截这个函数,画出空字符串就行:
- BOOL WINAPI myExtTextOutW(HDC hdc, int x, int y, UINT options, const RECT* lprect, LPCWSTR lpString, UINT c, const INT* lpDx)
- {
- if (c > 0)
- {
- if (wcsstr(lpString, L"Windows ") != 0 || wcsstr(lpString, L" Build ") != 0)
- {
- return DExtTextOutW(hdc, x, y, options, lprect, L"", 0, lpDx);
- }
- }
- BOOL res = DExtTextOutW(hdc, x, y, options, lprect, lpString, c, lpDx);
- return res;
- }
复制代码 下面那个水印,微软有专门两个函数用来获取和设置ZBID层:GetWindowBand、SetWindowBand。只要找到图示那层,把它隐藏掉或者重画就可以了。
- BOOL __stdcall myGetWindowBand(HWND hWnd, DWORD dwBand)
- {
- BOOL res = pGetWindowBand(hWnd, dwBand);
- if (dwBand == 14)
- {
- wchar_t wszWindowText[4096];
- GetWindowTextW(hWnd, wszWindowText, 4096);
- std::wstringstream ss;
- ss << "Function: " << __FUNCTION__ << " : " << dwBand << " : " << wszWindowText << "\n";
- OutputDebugStringW(ss.str().c_str());
- WNDPROC WndProc = (WNDPROC)GetWindowLongPtrW(hWnd, GWLP_WNDPROC);
- SetWindowLongPtrW(hWnd, GWLP_WNDPROC, (LONG_PTR) ProcCallback);
- }
- return res;
- }
复制代码 最后放上dll的源码。
dllmain.zip
(2.39 KB, 下载次数: 137)
去除水印及弹窗1.4.zip
(1.22 MB, 下载次数: 462)
去除水印及弹窗1.5.zip
(1.12 MB, 下载次数: 345)
|