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

时间:2008-10-06 08:28:21

标签: c# events windows-vista mouse

我正在C#中编写一个非常专业的应用程序,它作为整个桌面上的一个大多数透明窗口浮动。我希望能够创建鼠标事件并将其传递给我后面的应用程序,并使它们看起来“正常”运行,以响应这些事件。如果窗口管理器可以响应,也会更好。

我不是Windows大师,也不确定如何最好地实现这一点。

从此页面: http://bytes.com/forum/thread270002.html

似乎mouse_event会很好,但是因为我的应用程序浮动在其他所有内容上,所以我猜测我生成的事件永远不会进入下面的其他应用程序。

似乎替代方案是SendMessage,但这需要大量手动操作窗口,并且生成的鼠标事件不是“真实的”。

有关最佳方法的任何想法吗?

3 个答案:

答案 0 :(得分:2)

听起来你想做一些过滤用户输入的事情。

也许你只需要一个键盘/鼠标钩。

您可能想看看Windows API调用SetWindowsHookEx。

应该有足够的样本如何在C#中做到这一点,我发现的第一件事是this link(也许不是最好的文章,但应该给你这个想法)。

答案 1 :(得分:2)

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

首先,将表单的TransparencyKey和BackColor设置为相同。这对我没有任何视觉差异,因为我的表格已经在视觉上透明,但这将有助于让鼠标事件通过。

其次,以下代码将使鼠标事件“落入”您的表单。

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

        return createParams;
    }
}

最后,将TopMost设置为true。

现在,您的表单将在视觉上漂浮在所有内容之上,但会将焦点放在所有其他应用上。

答案 2 :(得分:1)

如果禁用控件并返回,则可以将MouseDown事件传递给父级。