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

时间:2012-07-31 23:11:59

标签: c# windows winforms winapi

我现在拥有的内容:我在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);

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


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


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

BTW我没有使用Winapi的经验,所以解决方案可能很明显。

2 个答案:

答案 0 :(得分:0)

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

来捕获

您可以通过user32!PostMessageuser32!SendMessage apis(read PostMessage function on msdn)向其他Windows表单发送邮件。

答案 1 :(得分:0)

您可以尝试在基础表单处理后转发事件。像

这样的东西
 protected override void OnDragOver(DragEventArgs drgevent)
 {
     base.OnDragOver(drgevent);
     MyControl.ForwardDragEvent(drgevent);
 }

在MyControl中:

public void ForwardDragEvent(DragEventArgs drgevent)
{
     base.OnDragOver(drgevent);
     //Or call your own method to handle the event
}

我用它来转发滚动事件,但在我的情况下,只有一个控件处理了事件..