C#将WndProc消息从表单传递到另一个表单

时间:2010-05-19 17:30:43

标签: c# forms touch messages wndproc

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

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

我已经尝试了一种天真的方法,只需调用下层格式的WndProc方法,给出来自叠加层的消息。 (同样我尝试将其进一步传递给浏览器控制窗口的WndProc)。这些方法都不起作用。我也试过简单地将Message对象的HWnd参数交换为下层表单/浏览器的句柄,同时尝试这个并且也没有用。

那么,是否有人能够想到更多的方法来尝试,或者可能是在表单之间传递Windows消息的正确方法?

谢谢, 亚历

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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控件以处理鼠标单击事件 并将此控件添加到Form 2

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));
        }
    }
}