[C#]WPF 中如何令窗体在按住某个键时临时解除鼠标穿透?
RT,基本需求是一个非透明悬浮窗,平时鼠标可以穿透窗体与其后方的其他应用窗体正常交互,但是在按下特定按键(例如 ctrl )时临时解除鼠标穿透状态,令悬浮窗可以被拖动或右键点击弹出 ContextMenu 。 感觉这个需求有些怪,搜了一圈没看到有类似的教程或提问。求各位大佬不吝赐教,谢谢!
RT,基本需求是一个非透明悬浮窗,平时鼠标可以穿透窗体与其后方的其他应用窗体正常交互,但是在按下特定按键(例如 ctrl )时临时解除鼠标穿透状态,令悬浮窗可以被拖动或右键点击弹出 ContextMenu 。 感觉这个需求有些怪,搜了一圈没看到有类似的教程或提问。求各位大佬不吝赐教,谢谢!
https://stackoverflow.com/questions/1524035/topmost-form-clicking-through-possible/1524047#1524047
我知道正常的方法是通过 SetWindowLong 为窗体设置 WS_EX_TRANSPARENT 来进行鼠标穿透。我的主要问题是在题目中的情况下应当如何实现“按住 ctrl 时临时解除穿透,让窗体可以被拖动、右键弹出菜单”的效果。
我能想到的思路有 2 种,1 是在当前窗体被鼠标拖拽、右键点击等事件时判断当前 ctrl 是否按下,如果是则执行正常的拖拽、弹出右键菜单等操作,如果否则将鼠标点击、拖动的事件放行给后面的窗体。但是我不清楚 windows 与 wpf 是否支持这样的操作。
另一种就是注册 ctrl 为全局快捷键,在按下时和解除时分别设置窗体的 WS_EX_TRANSPARENT 属性。但我同样不知道 windows 是否支持单独给 ctrl 注册全局快捷键而不影响其他程序正常响应 ctrl 键,也不知道是否可以捕获 ctrl 键被松开的事件。
因为感觉 2 条路都走不通,因此才发帖求助的 OTL
第二条路是可以的。