doc/devdocs/modules/mouseutils/mousepointer.md
Mouse Pointer Crosshairs is a utility that displays horizontal and vertical lines that intersect at the mouse cursor position, making it easier to track the cursor location on screen.
Mouse Pointer Crosshairs runs within the PowerToys Runner process and draws crosshair lines that follow the cursor in real-time.
src/modules/MouseUtils/MousePointerCrosshairs/InclusiveCrosshairs.cpp - Contains the main implementationWndProc - Handles window messages and mouse eventsWhen the utility is enabled:
A background thread is created to run the crosshairs logic asynchronously:
std::thread([=]() { InclusiveCrosshairsMain(hInstance, settings); }).detach();
The InclusiveCrosshairs instance is initialized and configured with user settings:
InclusiveCrosshairs crosshairs;
InclusiveCrosshairs::instance = &crosshairs;
crosshairs.ApplySettings(settings, false);
crosshairs.MyRegisterClass(hInstance);
The utility:
CreateInclusiveCrosshairs()WM_CREATE message to initialize the Windows Composition API (Compositor, visuals, and target)WS_EX_LAYERED, WS_EX_TRANSPARENT)The activation process works as follows:
Shortcut Detection
WndProc) receives a custom message WM_SWITCH_ACTIVATION_MODEToggle Drawing State
case WM_SWITCH_ACTIVATION_MODE:
if (instance->m_drawing)
{
instance->StopDrawing();
}
else
{
instance->StartDrawing();
}
break;
Start Drawing Function
StartDrawing() function is called to:
void InclusiveCrosshairs::StartDrawing()
{
Logger::info("Start drawing crosshairs.");
UpdateCrosshairsPosition();
m_hiddenCursor = false;
if (m_crosshairs_auto_hide)
{
CURSORINFO cursorInfo{};
cursorInfo.cbSize = sizeof(cursorInfo);
if (GetCursorInfo(&cursorInfo))
{
m_hiddenCursor = !(cursorInfo.flags & CURSOR_SHOWING);
}
SetAutoHideTimer();
}
if (!m_hiddenCursor)
{
ShowWindow(m_hwnd, SW_SHOWNOACTIVATE);
}
m_drawing = true;
m_mouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProc, m_hinstance, 0);
}
Stop Drawing Function
StopDrawing() function is called to:
While active, the utility:
WH_MOUSE_LL) to track cursor movementTo debug Mouse Pointer Crosshairs:
InclusiveCrosshairs.cpp fileMouseHookProc) updates the crosshairs position on every WM_MOUSEMOVE event