2008-10-06 56 views
4

我在C#中编写了一个非常专业的应用程序,该应用程序在整个桌面上作为大部分透明窗口浮动。我希望能够创建鼠标事件并将其传递给我后面的应用程序,并让它们看起来像“正常”一样运行,响应这些事件。如果窗口管理员能够做出回应,这也会更好。如何将鼠标事件传递给C#/ Vista中我的应用程序?

我不是Windows大师,我不确定如何最好地完成这个。

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

它会出现mouse_event将是一件好事,但因为我的应用程序是漂浮在一切,我猜我的生成的事件将永远不会使其对其他应用程序的下方。

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

任何想法的最佳方法来解决这个问题?

+0

您正在寻找/创建/活动,还是只允许现有的鼠标点击通过? – 2008-10-06 08:32:00

+0

我期待创建活动。 – Garth 2008-10-06 08:33:24

+0

如果你正在寻找创建事件,那么SendMessage就像它获得的一样好。 AFAIK,使用SendMessage发送的消息与普通消息无法区分,除非您专门查找它。 – 2008-10-06 08:37:43

回答

2

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

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

其次,下面的代码会让鼠标事件“落入”你的窗体。

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

     return createParams; 
    } 
} 

最后,设置TopMost为true。

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

2

听起来像你想要做的事情,像过滤用户输入。

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

你可能想看看windows API调用SetWindowsHookEx。

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

0

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

相关问题