??????Excavator? 2026-01-03 23:14 采纳率: 50%
浏览 13

桌面宠物软件导致任务栏与其余窗口的层级异常

桌面宠物软件导致任务栏与其余窗口的层级异常

我下载了一个桌面宠物软件(300桌宠,B站上一个博主做的),目前发现一个BUG,当我开启“角色总在最前”时,虽然屏幕上的小人会像悬浮窗一样始终在顶层,但是windows系统似乎变得无法判断其它窗口与任务栏的分级了,例如浏览器窗口和QQ窗口往下拖动时可以遮挡任务栏,只能再次点击任务栏才能让任务栏显示出来,切换应用和点开“开始菜单”变得麻烦了。经过python脚本的检测发现宠物创建了两个隐藏窗口:

任务栏句柄: 131314, 置顶状态: True
找到宠物窗口: 标题'...''DBG2333' 置顶True 透明False
找到宠物窗口: 标题='...''WTWindow' 置顶True 透明False

(虽然只添加了一个活动角色小人,却有两个窗口)
分析一下技术细节吧?这个BUG为何产生?为何宠物进程仅仅只是让自己置顶,就使得系统无法管理任务栏和其它窗口的层级?

经过简单的检测可以得知这是个.NET程序

文件头分析
✅ 是有效的Windows PE文件
✅ 可能是32位.NET程序


文件头部特征分析:
0000: 4d 5a 90 00 03 00 00 00 04 00 00 00 ff ff 00 00  MZ..............
0010: b8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00  ........@.......
0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0030: 00 00 00 00 00 00 00 00 00 00 00 00 18 01 00 00  ................
0040: 0e 1f ba 0e 00 b4 09 cd 21 b8 01 4c cd 21 54 68  ......Th
0050: 69 73 20 70 72 6f 67 72 61 6d 20 63 61 6e 6e 6f  is program canno
0060: 74 20 62 65 20 72 75 6e 20 69 6e 20 44 4f 53 20  t be run in DOS

检测结果: dotnet

img

img

  • 写回答

3条回答 默认 最新

  • 码界奇点 2026-01-04 09:42
    关注

    该问题是由于桌面宠物软件设置了置顶窗口,并可能修改了窗口层级属性,导致Windows窗口管理器(Z-order)出现异常,使任务栏失去正常的“总在最前”状态。

    核心原因分析

    1. 窗口层级冲突:宠物软件创建了多个置顶窗口(WS_EX_TOPMOST),干扰了系统对任务栏(通常为HWND_TOPMOST层级)的正常管理。
    2. 窗口所有者关系异常:宠物窗口可能错误地设置了与任务栏或其他系统窗口的所有者关系,导致层级计算混乱。
    3. 消息钩子或子类化影响:.NET程序可能通过钩子拦截或修改了窗口消息(如WM_WINDOWPOSCHANGING),影响了系统的层级管理逻辑。

    技术细节与验证步骤

    1. 使用Spy++或WinSpy检查窗口属性

    import win32gui
    import win32con
    
    def check_window_properties(hwnd):
        # 检查窗口样式
        style = win32gui.GetWindowLong(hwnd, win32con.GWL_STYLE)
        ex_style = win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE)
        
        # 检查是否为置顶窗口
        is_topmost = (ex_style & win32con.WS_EX_TOPMOST) != 0
        
        # 获取所有者窗口
        owner = win32gui.GetWindow(hwnd, win32con.GW_OWNER)
        
        return {
            'hwnd': hwnd,
            'topmost': is_topmost,
            'owner': owner,
            'style': style,
            'ex_style': ex_style
        }
    
    # 查找宠物窗口
    def find_pet_windows():
        windows = []
        
        def enum_callback(hwnd, results):
            class_name = win32gui.GetClassName(hwnd)
            if 'DBG2333' in class_name or 'WTWindow' in class_name:
                windows.append(check_window_properties(hwnd))
            return True
        
        win32gui.EnumWindows(enum_callback, None)
        return windows
    

    2. 临时修复方案

    import ctypes
    from ctypes import wintypes
    
    # 恢复任务栏正常层级
    def fix_taskbar_zorder():
        # 获取任务栏句柄
        taskbar_hwnd = ctypes.windll.user32.FindWindowW("Shell_TrayWnd", None)
        
        # 确保任务栏保持置顶
        ctypes.windll.user32.SetWindowPos(
            taskbar_hwnd,
            wintypes.HWND(-1),  # HWND_TOPMOST
            0, 0, 0, 0,
            wintypes.UINT(0x0001 | 0x0002)  # SWP_NOMOVE | SWP_NOSIZE
        )
        
        # 刷新任务栏
        ctypes.windll.user32.UpdateWindow(taskbar_hwnd)
    
    # 临时禁用宠物窗口置顶
    def disable_pet_topmost():
        pet_windows = find_pet_windows()
        for window in pet_windows:
            # 移除WS_EX_TOPMOST样式
            new_style = window['ex_style'] & ~win32con.WS_EX_TOPMOST
            win32gui.SetWindowLong(window['hwnd'], win32con.GWL_EXSTYLE, new_style)
            win32gui.ShowWindow(window['hwnd'], win32con.SW_HIDE)
            win32gui.ShowWindow(window['hwnd'], win32con.SW_SHOW)
    

    3. 根本解决方案建议

    1. 联系开发者修复:报告此BUG,建议在设置窗口置顶时使用正确的SetWindowPos参数组合。
    2. 程序修改建议
      • 避免创建多个置顶窗口
      • 使用HWND_TOPMOST时设置正确的hWndInsertAfter参数
      • 避免修改系统窗口的所有者关系
    3. 替代实现方案:使用WS_EX_LAYEREDWS_EX_TRANSPARENT实现透明悬浮效果,而非强制置顶。

    验证与测试

    运行上述脚本后,检查:

    1. 任务栏是否恢复正常层级
    2. 其他窗口是否不再遮挡任务栏
    3. 宠物窗口是否仍保持可见但不干扰系统层级

    如问题持续,可能需要更深入的窗口消息监控或考虑卸载该软件。

    评论

报告相同问题?

问题事件

  • 创建了问题 1月3日