我正在开发一个捕获活动窗口的屏幕捕获实用程序。我使用透明覆盖来捕获全屏,然后根据传递到底层桌面/窗口的鼠标移动事件覆盖活动窗口。
两个叠加窗口当前都使用WS_EX_TRANSPARENT
样式允许鼠标事件传递到底层窗口,以便我可以检测鼠标光标所在的位置。我抓住窗口手柄和矩形大小来勾画窗口,然后使用全局鼠标和键盘挂钩来接受或拒绝捕获。
它非常丑陋并且分散了代码(这就是为什么我现在不在这里发布)但是它一切都很好用,我可以在mousemove中突出显示窗口并使用全局鼠标和键处理程序捕获点击。
除了这个问题:
以外它都可以全局Windows挂钩不会触发管理员窗口,因此当我想捕获Powershell,Command或Visual Studio(在管理员模式下)窗口时,不会转发挂钩事件。
显然,使用Windows挂钩(或GetAsyncKeystate()
就此问题无法解决此安全问题。)
我尝试了几种不同的方法来解决这个问题:
我尝试使用突出显示窗口捕获鼠标/键事件,而不是使用Hooks 这种工作,但它很笨拙 - 如果根本没有选择窗口就会失败(无法退出),并且一旦选择了父级就不允许选择包含的窗口(即没有向下钻取)
< / LI>我也尝试过Win32 GetAsyncKeystate()
,它可以捕获最后一个鼠标或键盘输入,但是它也无法从管理员窗口发送鼠标或密钥交互。
所以我目前有两个选择不完美的解决方案:使用Hooks或GetAsyncKeyState
为除了管理员窗口之外的所有窗口获取正确的窗口浏览选择行为,或者我可以捕获所有窗口但是无法钻进子窗口选择父窗口后的窗口。
我已经走到了尽头,真正的问题是:
有没有办法创建一个半透明或透明的窗口,可以拦截鼠标点击和将它们传递到下面的窗口区域?