Skip to content

鼠标穿透对任务栏窗口也生效#2149

Open
doraemonkeys wants to merge 5 commits intozhongyang219:masterfrom
doraemonkeys:master
Open

鼠标穿透对任务栏窗口也生效#2149
doraemonkeys wants to merge 5 commits intozhongyang219:masterfrom
doraemonkeys:master

Conversation

@doraemonkeys
Copy link

@zhongyang219
Copy link
Owner

任务栏窗口的鼠标穿透不应该跟主窗口的鼠标穿透一起吧,如果我只想主窗口鼠标穿透但是不想让任务栏窗口也鼠标穿透怎么办。如果要做这个功能,应该在选项设置>任务栏窗口设置中额外增加一个“鼠标穿透”选项,用于设置任务栏窗口的鼠标穿透。
image

@BombaxCeiba
Copy link
Contributor

这么改D2D渲染模式也不会生效,还需要考虑D2D渲染的场景

@doraemonkeys
Copy link
Author

@zhongyang219 @BombaxCeiba 我让 claude code 改了一版,你们看行吗

实现摘要

共修改了 20 个文件

核心逻辑变更

  1. CommonData.h -- 在 TaskBarSettingData 中添加了 bool m_mouse_penetrate{ false },为任务栏窗口提供独立的鼠标穿透设置。

  2. TrafficMonitor.cpp -- 在 [task_bar] 节中添加了新设置的 INI 读写逻辑。加载时使用 m_main_wnd_data.m_mouse_penetrate 作为迁移默认值,这样原先已启用鼠标穿透的用户在首次升级时会自动继承该设置到任务栏窗口。

  3. TrafficMonitorDlg.cpp -- 还原了 SetMousePenetrate() 中的改动,移除了将任务栏窗口的 WS_EX_TRANSPARENT 与主窗口设置耦合的 4 行代码。

  4. TaskBarDlg.h/cpp -- 添加了 WM_NCHITTEST 消息处理作为任务栏鼠标穿透的唯一运行时机制。当 theApp.m_taskbar_data.m_mouse_penetrate 为 true 时返回 HTTRANSPARENT。该方案与渲染模式无关——无论使用 GDI、D2D1 还是 D2D1+DComposition,都在窗口消息层面生效。

设置界面变更

  1. resource.h -- 添加了 IDC_TASKBAR_MOUSE_PENETRATE_CHECK(ID 1220),并将 _APS_NEXT_CONTROL_VALUE 递增至 1221。

  2. TrafficMonitor.rc -- 在 IDD_TASKBAR_SETTINGS_DIALOG 的"任务栏窗口"分组中添加了复选框控件,位于"任务栏窗口显示在左侧"复选框之后。下方所有控件下移 12 像素,对话框高度从 500 增至 512。

  3. TaskBarSettingsDlg.h/cpp -- 添加了消息映射条目、OnInitDialog 中的复选框初始化以及 OnBnClickedTaskbarMousePenetrateCheck 处理函数。

@BombaxCeiba
Copy link
Contributor

@zhongyang219 @BombaxCeiba 我让 claude code 改了一版,你们看行吗

实现摘要

共修改了 20 个文件

核心逻辑变更

  1. CommonData.h -- 在 TaskBarSettingData 中添加了 bool m_mouse_penetrate{ false },为任务栏窗口提供独立的鼠标穿透设置。
  2. TrafficMonitor.cpp -- 在 [task_bar] 节中添加了新设置的 INI 读写逻辑。加载时使用 m_main_wnd_data.m_mouse_penetrate 作为迁移默认值,这样原先已启用鼠标穿透的用户在首次升级时会自动继承该设置到任务栏窗口。
  3. TrafficMonitorDlg.cpp -- 还原了 SetMousePenetrate() 中的改动,移除了将任务栏窗口的 WS_EX_TRANSPARENT 与主窗口设置耦合的 4 行代码。
  4. TaskBarDlg.h/cpp -- 添加了 WM_NCHITTEST 消息处理作为任务栏鼠标穿透的唯一运行时机制。当 theApp.m_taskbar_data.m_mouse_penetrate 为 true 时返回 HTTRANSPARENT。该方案与渲染模式无关——无论使用 GDI、D2D1 还是 D2D1+DComposition,都在窗口消息层面生效。

设置界面变更

  1. resource.h -- 添加了 IDC_TASKBAR_MOUSE_PENETRATE_CHECK(ID 1220),并将 _APS_NEXT_CONTROL_VALUE 递增至 1221。
  2. TrafficMonitor.rc -- 在 IDD_TASKBAR_SETTINGS_DIALOG 的"任务栏窗口"分组中添加了复选框控件,位于"任务栏窗口显示在左侧"复选框之后。下方所有控件下移 12 像素,对话框高度从 500 增至 512。
  3. TaskBarSettingsDlg.h/cpp -- 添加了消息映射条目、OnInitDialog 中的复选框初始化以及 OnBnClickedTaskbarMousePenetrateCheck 处理函数。

D2D的实现比较特殊,需要让背景纹理透明而不是不透明。最开始我是实现成透明的,然后有了穿透效果,但是在评论里面被当成bug了,所以我改回去了。你只需要找到d2d渲染那边初始化纹理alpha为1的逻辑,按照你的设置动态把值变化设为0或1就行。

@doraemonkeys
Copy link
Author

@zhongyang219 @BombaxCeiba 我让 claude code 改了一版,你们看行吗

实现摘要

共修改了 20 个文件

核心逻辑变更

  1. CommonData.h -- 在 TaskBarSettingData 中添加了 bool m_mouse_penetrate{ false },为任务栏窗口提供独立的鼠标穿透设置。
  2. TrafficMonitor.cpp -- 在 [task_bar] 节中添加了新设置的 INI 读写逻辑。加载时使用 m_main_wnd_data.m_mouse_penetrate 作为迁移默认值,这样原先已启用鼠标穿透的用户在首次升级时会自动继承该设置到任务栏窗口。
  3. TrafficMonitorDlg.cpp -- 还原了 SetMousePenetrate() 中的改动,移除了将任务栏窗口的 WS_EX_TRANSPARENT 与主窗口设置耦合的 4 行代码。
  4. TaskBarDlg.h/cpp -- 添加了 WM_NCHITTEST 消息处理作为任务栏鼠标穿透的唯一运行时机制。当 theApp.m_taskbar_data.m_mouse_penetrate 为 true 时返回 HTTRANSPARENT。该方案与渲染模式无关——无论使用 GDI、D2D1 还是 D2D1+DComposition,都在窗口消息层面生效。

设置界面变更

  1. resource.h -- 添加了 IDC_TASKBAR_MOUSE_PENETRATE_CHECK(ID 1220),并将 _APS_NEXT_CONTROL_VALUE 递增至 1221。
  2. TrafficMonitor.rc -- 在 IDD_TASKBAR_SETTINGS_DIALOG 的"任务栏窗口"分组中添加了复选框控件,位于"任务栏窗口显示在左侧"复选框之后。下方所有控件下移 12 像素,对话框高度从 500 增至 512。
  3. TaskBarSettingsDlg.h/cpp -- 添加了消息映射条目、OnInitDialog 中的复选框初始化以及 OnBnClickedTaskbarMousePenetrateCheck 处理函数。

D2D的实现比较特殊,需要让背景纹理透明而不是不透明。最开始我是实现成透明的,然后有了穿透效果,但是在评论里面被当成bug了,所以我改回去了。你只需要找到d2d渲染那边初始化纹理alpha为1的逻辑,按照你的设置动态把值变化设为0或1就行。

修改了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants