You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建具备多特性的Sticky Notes类窗体?解决透明失效难题

搞定Sticky Notes风格窗体:不用定时器的完美方案

嘿,我来帮你解决这个问题!你之前踩的坑其实很明确:把窗口设为ProjMan的子窗口后,它就不再是顶级窗口了,而Windows的半透明分层样式(WS_EX_LAYERED)只对顶级窗口生效,所以半透明效果直接失效。而且定时器方案确实太笨拙,咱们用Windows原生API就能完美实现所有需求。

1. 先把窗口样式配对(基础中的基础)

初始化窗口时,用这些样式组合,直接搞定“无任务栏按钮”+“支持透明”的基础要求:

// 主窗口样式:弹出式窗口,加个边框方便拖动(可选)
DWORD dwStyle = WS_POPUP | WS_BORDER;
// 扩展样式:分层透明 + 不抢焦点 + 工具窗口(隐藏任务栏按钮)+ 点击穿透(可选)
DWORD dwExStyle = WS_EX_LAYERED | WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW | WS_EX_TRANSPARENT;

// 创建窗口时,父窗口直接设为NULL,保持顶级窗口身份
HWND hWnd = CreateWindowEx(
    dwExStyle,
    szWindowClass,
    szTitle,
    dwStyle,
    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
    NULL,
    NULL,
    hInstance,
    NULL
);

2. 让窗口永远待在最底层

要实现“始终处于其他窗口下方”,不用反复调用SetWindowPos,直接拦截WM_WINDOWPOSCHANGING消息,强制把窗口钉在Z序底部:

case WM_WINDOWPOSCHANGING:
{
    WINDOWPOS* pwp = (WINDOWPOS*)lParam;
    // 取消系统的Z序调整,强制把窗口放在最下面
    pwp->flags &= ~SWP_NOZORDER;
    pwp->hwndInsertAfter = HWND_BOTTOM;
    return 0; // 不执行默认处理
}

窗口创建后再补一次SetWindowPos,确保初始位置就在底层:

SetWindowPos(hWnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);

3. 硬刚Win+D/Win+W:绝不被最小化

Win+D/Win+W是系统级的显示桌面命令,会试图最小化所有顶级窗口。咱们直接拦截两个关键消息就能破解:

case WM_SYSCOMMAND:
    // 拦截最小化命令,直接无视
    if ((wParam & 0xFFF0) == SC_MINIMIZE) {
        return 0;
    }
    // 其他系统命令正常处理
    return DefWindowProc(hWnd, message, wParam, lParam);

case WM_QUERYOPEN:
    // 告诉系统:这个窗口不用你操心恢复,我自己盯着呢
    return TRUE;

这套组合拳下来,Win+D/Win+W触发时,你的窗口会纹丝不动,完全不受影响。

4. 半透明效果完美生效

因为窗口是顶级窗口,且已经开了WS_EX_LAYERED,直接调用SetLayeredWindowAttributes就能搞定透明:

// 设置整体透明度,alpha值0-255,比如200就是半透明
SetLayeredWindowAttributes(hWnd, 0, 200, LWA_ALPHA);
// 要是想让特定颜色的区域完全透明,就用这个:
// SetLayeredWindowAttributes(hWnd, RGB(255,255,255), 0, LWA_COLORKEY);

动态调整透明度也没问题,随时调用这个函数就行,再也不会出现透明失效的情况。

5. 额外保险:确保无任务栏按钮

虽然WS_EX_TOOLWINDOW已经能隐藏任务栏按钮,但万一系统有兼容问题,再补一句:

// 彻底让窗口不在Alt+Tab和任务栏里露面
SetWindowLongPtr(hWnd, GWL_EXSTYLE, GetWindowLongPtr(hWnd, GWL_EXSTYLE) | WS_EX_TOOLWINDOW);

这样一套操作下来,所有需求都完美满足:

  • Win+D/Win+W触发时,窗口绝不被最小化
  • 永远老老实实待在其他窗口下方
  • 任务栏里完全看不到它
  • 半透明效果正常工作
  • 全程不需要定时器这种临时方案

内容的提问来源于stack exchange,提问作者Error - CPU Not Foud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:33:08