如何将鼠标事件传递给C#/ Vista中我的应用程序?
问题描述:
我在C#中编写了一个非常专业的应用程序,该应用程序在整个桌面上作为大部分透明窗口浮动。我希望能够创建鼠标事件并将其传递给我后面的应用程序,并让它们看起来像“正常”一样运行,响应这些事件。如果窗口管理员能够做出回应,这也会更好。如何将鼠标事件传递给C#/ Vista中我的应用程序?
我不是Windows大师,我不确定如何最好地完成这个。
从这个页面: http://bytes.com/forum/thread270002.html
它会出现mouse_event将是一件好事,但因为我的应用程序是漂浮在一切,我猜我的生成的事件将永远不会使其对其他应用程序的下方。
它似乎是SendMessage的替代方法,但这需要大量的手动操作,并且生成的鼠标事件不是“真实的”。
任何想法的最佳方法来解决这个问题?
答
查看系统挂钩和其他低级解决方案后,我发现一个更简单的方法。
首先,将窗体的TransparencyKey和BackColor设置为相同。这对我来说没有任何视觉上的差异,因为我的表单已经是视觉透明的,但是这将有助于让鼠标事件通过。
其次,下面的代码会让鼠标事件“落入”你的窗体。
protected override CreateParams CreateParams
{
get
{
CreateParams createParams = base.CreateParams;
createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT
return createParams;
}
}
最后,设置TopMost为true。
您的表单现在将浮动在所有视觉上,但会放弃所有其他应用的焦点。
答
听起来像你想要做的事情,像过滤用户输入。
也许你只需要一个键盘/鼠标钩。
你可能想看看windows API调用SetWindowsHookEx。
还应该有足够的样本如何做到这一点在C#可用,我发现的第一件事是this link(也许不是最好的文章,但应该给你的想法)。
答
如果您禁用该控件并返回,您可以将MouseDown事件传递给父项。
您正在寻找/创建/活动,还是只允许现有的鼠标点击通过? – 2008-10-06 08:32:00
我期待创建活动。 – Garth 2008-10-06 08:33:24
如果你正在寻找创建事件,那么SendMessage就像它获得的一样好。 AFAIK,使用SendMessage发送的消息与普通消息无法区分,除非您专门查找它。 – 2008-10-06 08:37:43