创建一个WPF窗口,捕获并传递鼠标事件

时间:2016-11-24 09:00:33

标签: c# wpf winapi

我正在开发一个捕获活动窗口的屏幕捕获实用程序。我使用透明覆盖来捕获全屏,然后根据传递到底层桌面/窗口的鼠标移动事件覆盖活动窗口。

两个叠加窗口当前都使用WS_EX_TRANSPARENT样式允许鼠标事件传递到底层窗口,以便我可以检测鼠标光标所在的位置。我抓住窗口手柄和矩形大小来勾画窗口,然后使用全局鼠标和键盘挂钩来接受或拒绝捕获。

它非常丑陋并且分散了代码(这就是为什么我现在不在这里发布)但是它一切都很好用,我可以在mousemove中突出显示窗口并使用全局鼠标和键处理程序捕获点击。

除了这个问题:

以外它都可以
  

全局Windows挂钩不会触发管理员窗口,因此当我想捕获Powershell,Command或Visual Studio(在管理员模式下)窗口时,不会转发挂钩事件。

显然,使用Windows挂钩(或GetAsyncKeystate()就此问题无法解决此安全问题。)

我尝试了几种不同的方法来解决这个问题:

  • 我尝试使用突出显示窗口捕获鼠标/键事件,而不是使用Hooks 这种工作,但它很笨拙 - 如果根本没有选择窗口就会失败(无法退出),并且一旦选择了父级就不允许选择包含的窗口(即没有向下钻取)

    < / LI>
  • 我也尝试过Win32 GetAsyncKeystate(),它可以捕获最后一个鼠标或键盘输入,但是它也无法从管理员窗口发送鼠标或密钥交互。

所以我目前有两个选择不完美的解决方案:使用Hooks或GetAsyncKeyState为除了管理员窗口之外的所有窗口获取正确的窗口浏览选择行为,或者我可以捕获所有窗口但是无法钻进子窗口选择父窗口后的窗口。

我已经走到了尽头,真正的问题是:

有没有办法创建一个半透明或透明的窗口,可以拦截鼠标点击将它们传递到下面的窗口区域?

0 个答案:

没有答案