将winapi事件转发到另一个窗口

Dea*_*eye 5 c# windows winapi winforms

我现在拥有的:我在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);
Run Code Online (Sandbox Code Playgroud)

但现在,我想将所有事件发送到我的应用程序窗口(顶部是半透明的)和Web浏览器(在我的应用程序下).因此,例如,如果我单击,则单击在两个窗口中都起作用,就像它们位于顶部一样.我想这样做的唯一方法是捕获所有事件,然后将它们转发到较低的窗口,但有没有办法做到这一点?我使用winforms作为窗口lib.


我现在所做的并不重要,因为我想通常消耗事件,然后将它们转发到底层窗口.所以这与我现在使用WS_EX_TRANSPARENT所做的完全不同.这一点是同时拖动两个窗口中的内容.如果有更好的方法,我会很高兴听到它.


至少我需要的是将拖动事件传输到两个窗口,并将所有其他事件传输到底层窗口(不受我的控制).那么,也许更容易将我的窗口保持为WS_EX_TRANSPARENT(使事件直通到底层窗口)并简单地安装全局钩子来接收拖动事件?你怎么看?

顺便说一句,我没有使用Winapi的经验,因此解决方案可能很明显.

Sec*_*att 0

您可以通过在表单上重载 WndProc 来捕获发送给您自己的表单的 Windows 事件,或者通过调用user32!GetMessage

user32!PostMessage您可以通过或api将消息发送到其他 Windows 窗体user32!SendMessage请参阅 msdn 上的 PostMessage 函数)。