【问题标题】:C# Passing WndProc Messages from a form to another formC# 将 WndProc 消息从一个窗体传递到另一个窗体
【发布时间】:2011-02-21 12:19:04
【问题描述】:

我正在开发具有两个 Windows 窗体的 C# 应用程序。两种形式都是全屏的,一种形式位于另一种形式的顶部作为透明覆盖。底部表单包含一个网络浏览器(也是全屏浏览器)。我正在跟踪透明覆盖表单上的触摸输入,以便在屏幕上捕获手势并绘制按钮和其他控件。我需要做的是将覆盖表单在其 WndProc 函数中获取的所有 Windows 消息发送到下面的表单(或表单中的 Web 浏览器控件,因为基本上所有较低的表单都用于包含)。

基本上我只需要处理叠加层上的手势,所有鼠标消息仍需要传输到网络浏览器以提供某些功能。

我已经尝试过根据覆盖层的消息调用较低表单的 WndProc 方法的天真方法。 (同样,我尝试将其进一步传递给浏览器控制窗口的 WndProc)。这些方法都不起作用。我还尝试在尝试此操作时将 Message 对象的 HWnd 参数简单地交换为较低窗体/浏览器的句柄,但这也不起作用。

那么,谁能想到更多的方法来尝试,或者可能是在窗体之间传递 windows 消息的正确方法?

谢谢, 亚历克斯

【问题讨论】:

  • 为什么你只限制自己使用 WndProc 消息?
  • 这就是我目前接收触摸输入的方式。但是,我相信触摸输入也被视为鼠标输入,所以我想还有一个问题是将所有鼠标事件传递到较低形式的简单/干净的方法。

标签: c# forms touch messages wndproc


【解决方案1】:

创建一个主窗体如何,让这两个窗体成为子窗体。将子窗体中的事件委托给主窗体,让主窗体处理您要处理的任何事件。

【讨论】:

  • 您是在谈论以某种形式使用 MDI 还是只是一个架构建议?如果是 MDI,那么我已经尝试过了,而且 MDI 子表单似乎不能透明。如果你在谈论建筑,那么这已经是我正在做的事情了。覆盖表单是主表单,其中包含浏览器表单作为对象。
  • 是的,使用 MDI,您将没有透明度。
  • 不幸的是,覆盖表单中的透明度是必要的,因为它的真正目的是为要处理的触摸输入提供一个垫子,然后操纵下面浏览器的内容。
  • @Alex:不是真正的 MDI; 3种表格可以帮助您建立主/子关系;这实际上意味着,从主窗体中实例化子对象。将子窗体的事件委托给掌握;并在主窗体中处理事件 - 并且可能隐藏主窗体,以便您只能看到分层的子窗体。
【解决方案2】:
var topForm = new Form1(); // top form
var browserForm = new Form2(); // bottom form with webbrowser control

将 MouseClick 事件添加到 Form1

private void Form1_MouseClick(object sender, MouseEventArgs e)
{
     browserForm.DoClick(e.X, e.Y);
}

创建自定义 WebBrowserEx 控件来处理鼠标点击事件 并将此控件添加到 Form2

namespace WindowsFormsApplication1
{
    public class WebBrowserEx: System.Windows.Forms.WebBrowser
    {
        public void DoClick(int x, int y)
        {
            base.OnMouseClick(new MouseEventArgs(MouseButtons.Left, 1, x, y, 0));
        }
    }
}

【讨论】:

猜你喜欢
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-04
相关资源
最近更新 更多