Guest User

Untitled

a guest
Jul 12th, 2026
356
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.63 KB | None | 0 0
  1. // ==WindhawkMod==
  2. // @id desktop-marquee-fade-v26
  3. // @name Desktop Marquee Fade (Async)
  4. // @description Add a smooth, modern fade effect to your desktop selection
  5. // @version 26.0.1
  6. // @author angel_lov
  7. // @include explorer.exe
  8. // @compilerOptions -luser32 -lgdi32
  9. // ==/WindhawkMod==
  10.  
  11. #define NOMINMAX
  12. #include <windows.h>
  13. #include <windhawk_api.h>
  14. #include <thread>
  15. #include <commctrl.h>
  16.  
  17. #pragma comment(lib, "user32.lib")
  18. #pragma comment(lib, "gdi32.lib")
  19. #pragma comment(lib, "comctl32.lib")
  20.  
  21. HWND g_hOverlayWnd = NULL;
  22. HHOOK g_hMouseHook = NULL;
  23. POINT g_dragStart = { 0 };
  24. bool g_isDragging = false;
  25.  
  26.  
  27. HBRUSH g_hBrush = NULL;
  28. HPEN g_hPen = NULL;
  29.  
  30. #define START_ALPHA 60
  31.  
  32. LRESULT CALLBACK OverlayWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
  33. static int s_alpha = 0;
  34.  
  35. switch (msg) {
  36. case WM_USER + 1: {
  37. KillTimer(hwnd, 1);
  38. RECT* prc = (RECT*)lParam;
  39.  
  40. SetWindowPos(hwnd, HWND_TOPMOST, prc->left, prc->top,
  41. prc->right - prc->left, prc->bottom - prc->top,
  42. SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOREDRAW);
  43.  
  44. ShowWindow(hwnd, SW_SHOWNA);
  45. s_alpha = START_ALPHA;
  46. SetLayeredWindowAttributes(hwnd, 0, (BYTE)s_alpha, LWA_ALPHA);
  47.  
  48. RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW);
  49.  
  50. delete prc;
  51. SetTimer(hwnd, 1, 30, NULL);
  52. return 0;
  53. }
  54. case WM_TIMER: {
  55. s_alpha -= 8;
  56. if (s_alpha <= 0) {
  57. KillTimer(hwnd, 1);
  58. s_alpha = 0;
  59. ShowWindow(hwnd, SW_HIDE);
  60. } else {
  61. SetLayeredWindowAttributes(hwnd, 0, (BYTE)s_alpha, LWA_ALPHA);
  62. }
  63. return 0;
  64. }
  65. case WM_PAINT: {
  66. PAINTSTRUCT ps;
  67. HDC hdc = BeginPaint(hwnd, &ps);
  68. RECT rc;
  69. GetClientRect(hwnd, &rc);
  70.  
  71. int radius = 4;
  72.  
  73. HBRUSH hOldBrush = (HBRUSH)SelectObject(hdc, g_hBrush);
  74. HPEN hOldPen = (HPEN)SelectObject(hdc, g_hPen);
  75.  
  76. RoundRect(hdc, 0, 0, rc.right, rc.bottom, radius, radius);
  77.  
  78. SelectObject(hdc, hOldPen);
  79. SelectObject(hdc, hOldBrush);
  80.  
  81. EndPaint(hwnd, &ps);
  82. return 0;
  83. }
  84. case WM_ERASEBKGND: return 1;
  85. }
  86. return DefWindowProc(hwnd, msg, wParam, lParam);
  87. }
  88.  
  89. LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) {
  90. if (nCode == HC_ACTION) {
  91. MSLLHOOKSTRUCT* pMouse = (MSLLHOOKSTRUCT*)lParam;
  92.  
  93. if (wParam == WM_LBUTTONDOWN) {
  94. HWND hWndUnder = WindowFromPoint(pMouse->pt);
  95. wchar_t className[256];
  96. GetClassNameW(hWndUnder, className, 256);
  97.  
  98. if (wcscmp(className, L"SysListView32") == 0) {
  99.  
  100. LVHITTESTINFO hit = {0};
  101. hit.pt = pMouse->pt;
  102. ScreenToClient(hWndUnder, &hit.pt);
  103.  
  104. int nItem = (int)SendMessageW(hWndUnder, LVM_HITTEST, 0, (LPARAM)&hit);
  105.  
  106. if (nItem == -1) { // hit on empty space
  107. g_dragStart = pMouse->pt;
  108. g_isDragging = true;
  109. } else {
  110. g_isDragging = false; // hit on icon
  111. }
  112. } else {
  113. g_isDragging = false;
  114. }
  115. }
  116. else if (wParam == WM_LBUTTONUP && g_isDragging) {
  117. g_isDragging = false;
  118.  
  119. int w = (pMouse->pt.x > g_dragStart.x ? pMouse->pt.x - g_dragStart.x : g_dragStart.x - pMouse->pt.x);
  120. int h = (pMouse->pt.y > g_dragStart.y ? pMouse->pt.y - g_dragStart.y : g_dragStart.y - pMouse->pt.y);
  121.  
  122. if (w > 10 && h > 10) {
  123. int left = (g_dragStart.x < pMouse->pt.x ? g_dragStart.x : pMouse->pt.x);
  124. int top = (g_dragStart.y < pMouse->pt.y ? g_dragStart.y : pMouse->pt.y);
  125.  
  126. RECT* prc = new RECT{ left, top, left + w, top + h };
  127. PostMessageW(g_hOverlayWnd, WM_USER + 1, 0, (LPARAM)prc);
  128. }
  129. }
  130. }
  131. return CallNextHookEx(g_hMouseHook, nCode, wParam, lParam);
  132. }
  133.  
  134. BOOL Wh_ModInit() {
  135. std::thread([]() {
  136. g_hBrush = CreateSolidBrush(GetSysColor(COLOR_HIGHLIGHT));
  137. g_hPen = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_HIGHLIGHT));
  138.  
  139. WNDCLASSW wc = {0};
  140. wc.lpfnWndProc = OverlayWndProc;
  141. wc.hInstance = GetModuleHandle(NULL);
  142. wc.lpszClassName = L"FadeMarqueeClass";
  143. wc.hbrBackground = (HBRUSH)GetStockObject(NULL_BRUSH);
  144. RegisterClassW(&wc);
  145.  
  146. g_hOverlayWnd = CreateWindowExW(WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_TOOLWINDOW | WS_EX_TOPMOST | WS_EX_NOACTIVATE,
  147. wc.lpszClassName, NULL, WS_POPUP, 0, 0, 0, 0, NULL, NULL, wc.hInstance, NULL);
  148.  
  149. ShowWindow(g_hOverlayWnd, SW_HIDE);
  150.  
  151. g_hMouseHook = SetWindowsHookExW(WH_MOUSE_LL, MouseHookProc, GetModuleHandle(NULL), 0);
  152. MSG msg;
  153. while (GetMessage(&msg, NULL, 0, 0)) DispatchMessage(&msg);
  154.  
  155. if (g_hMouseHook) UnhookWindowsHookEx(g_hMouseHook);
  156. }).detach();
  157. return TRUE;
  158. }
  159.  
  160. void Wh_ModUninit() {
  161. PostMessageW(g_hOverlayWnd, WM_QUIT, 0, 0);
  162. if (g_hBrush) DeleteObject(g_hBrush);
  163. if (g_hPen) DeleteObject(g_hPen);
  164. }
Advertisement
Add Comment
Please, Sign In to add comment