【发布时间】:2012-07-29 19:47:49
【问题描述】:
我现在拥有的:我在 C# 中的应用程序是半透明的,并且不会捕获 winapi 事件 - 每次点击、拖动等都会被底层窗口捕获,这是一个单独的应用程序(如 webbrower)。我用它来覆盖浏览器显示的信息。这是我的代码:
int exstyle = GetWindowLong(this.Handle, GWL_EXSTYLE);
exstyle |= WS_EX_TRANSPARENT;
SetWindowLong(this.Handle, GWL_EXSTYLE, exstyle);
IntPtr hwndf = this.Handle;
IntPtr hwndParent = GetDesktopWindow();
SetParent(hwndf, hwndParent);
但是现在,我想将所有事件发送到我的应用程序窗口(顶部是半透明的)和网络浏览器(在我的应用程序下)。因此,例如,如果我单击,则单击在两个窗口中都有效,就好像它们在顶部一样。我想这样做的唯一方法是捕获所有事件,然后将它们转发到较低的窗口,但是有什么办法吗? 我使用 winforms 作为窗口库。
我现在所做的并不那么重要,因为我想正常消费事件,然后将它们转发到底层窗口。所以这与我现在使用 WS_EX_TRANSPARENT 所做的完全不同。这样做的目的是同时在两个窗口中拖动内容。如果有更好的方法,我会很高兴听到它。
至少我需要将拖动事件传输到两个窗口,并将所有其他事件传输到底层窗口(不在我的控制之下)。所以,也许将我的窗口作为 WS_EX_TRANSPARENT (使事件传递到底层窗口)并简单地安装全局挂钩来接收拖动事件会更容易?你怎么看?
顺便说一句,我没有使用 Winapi 的经验,所以解决方案可能很明显。
【问题讨论】:
-
我不明白你怎么没有收到事件......你是在创建一个实际的窗口(你应该)?还是直接在屏幕上绘图(你不应该!)?
-
@tenfour 通过设置
WS_EX_TRANSPARENT样式。 -
@tenfour 是的,我使用 .net winform 创建的窗口,绘图由 winform 处理,所以它是创建窗口。我只设置了一个样式 WS_EX_TRANSPARENT 并将窗口父级设置为桌面,这使得事件传递到底层窗口,如下所示:codeproject.com/Articles/12877/Transparent-Click-Through-Forms 是的,它确实使消息不会进入窗口,只要窗口直接是桌面的子级。
-
@tenfour 如果我删除 WS_EX_TRANSPARENT,顶部的窗口将捕获所有事件。那么我应该如何将它们转发到底层窗口?
标签: c# windows winforms winapi