如何在C#/Vista中将鼠标事件传递给我的应用程序背后的应用程序?

4
我正在使用C#编写一款非常专业的应用程序,它作为一个大部分透明的窗口浮动在整个桌面上方。我希望能够创建并传递鼠标事件给我的后面的应用程序,并使它们看起来像是正常操作,响应这些事件。如果窗口管理器也能响应就更好了。
我不是Windows高手,也不确定最佳实现方式。
从这个页面: http://bytes.com/forum/thread270002.html 可以看出mouse_event可能是一个不错的选择,但由于我的应用程序浮动在其他所有应用程序之上,我猜测我的生成事件永远不会到达下面的其他应用程序。
似乎SendMessage是另一个选择,但这需要对窗口进行相当多的手动操作,并且生成的鼠标事件不是“真实”的。
你有什么想法来解决这个问题吗?

你是想要创建事件,还是只允许现有的鼠标点击通过? - Alex Lyman
我正在寻求创建事件。 - Garth
如果您想创建事件,则SendMessage是最好的选择。据我所知,使用SendMessage发送的消息与普通消息没有区别,除非您特别寻找它。 - Matthew Scharley
如果有人感兴趣的话,这个问题所提供的工作是一个可以在Windows中进行全身输入的系统。我根据Wii遥控器按键事件创建了鼠标事件。你可以在这里看到它:http://www.youtube.com/watch?v=7dLDVL7rtrI - Garth
3个回答

2
听起来你想做的事情是过滤用户输入。
也许你只需要一个键盘/鼠标钩子。
你可能需要看一下Windows API调用SetWindowsHookEx。
在C#中有足够的示例可供使用,我找到的第一篇文章是this link(也许不是最好的文章,但应该能给你提供思路)。

请注意,如果您使用钩子,它们将无法在管理员窗口(如PowerShell、以管理员身份运行的VS等)中工作,如果以用户模式运行。 - Rick Strahl

2

在查看系统钩子和其他低级解决方案后,我发现了一种更简单的方法。

首先,将窗体的TransparencyKey和BackColor设置为相同。这对我来说在视觉上没有任何区别,因为我的窗体已经是视觉透明的,但这将有助于让鼠标事件穿过。

其次,以下代码将使鼠标事件“穿透”您的窗体。

protected override CreateParams CreateParams
{
    get
    {
        CreateParams createParams = base.CreateParams;
        createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT

        return createParams;
    }
}

最后,将TopMost设置为true。

现在,您的窗体将漂浮在所有可视内容的上方,但会放弃对其他应用程序的焦点。


问题是你想用它来做什么——作为一个快速的单次使用应用程序,这可能效果很好,但如果你想在更多的框上使用这样的东西,这可能会导致更多的问题——例如,如果存在另一个最顶层的窗口,那该怎么办。 - Fionn
Fionn:同意。其他最顶层的窗口会被破坏。我们可以有多少个最顶层的应用程序?然而,这是最简单的方法,而无需降低级别。 - Garth

1
如果你禁用控件并返回,你就能将MouseDown事件传递给父级。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接