5

我现在拥有的:我在 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 的经验,所以解决方案可能很明显。

4

2 回答 2

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
}

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

于 2013-09-26T08:26:05.273 回答
0

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

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

于 2012-09-06T12:02:45.823 回答