我想传递一个事件(MouseWheel)从一个控件到另一个。当第一个控件捕获事件时,它应该调用第二个控件上此事件的默认处理程序。这是我尝试做的伪代码。
void Control1_MouseWheel(object sender, MouseEventArgs e)
{
//do something
Control2_MouseWheel(sender,e);
}
编辑:Control2是一个COM接口,它的处理程序不是写的。
您可以设置两个控件具有相同的事件处理程序。(由设计器或代码)
Control1.MouseWheel += CommonMouseWheelHandler;
Control2.MouseWheel += CommonMouseWheelHandler;
protected void CommonMouseWheelHandler(object sender, MouseEventArgs e)
{
... your common code here...
}
您可以使用SendMessage
方法向第二个控件发送WM_MOUSEWHEEL
消息:
SendMessage(destWindowHandle, m.Msg, (int)m.WParam, (int)m.LParam);
下面是两个列表框的示例,一个滚动另一个滚动。
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace WindowsFormsApplication18
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
public class MessageFilter : IMessageFilter
{
IntPtr sourceWindowHandle;
IntPtr destWindowHandle;
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
public MessageFilter(IntPtr sourceHandle, IntPtr destHandle)
{
sourceWindowHandle = sourceHandle;
destWindowHandle = destHandle;
}
public bool PreFilterMessage(ref Message m)
{
if (m.HWnd == sourceWindowHandle && m.Msg == 0x020A)// mousewheel
SendMessage(destWindowHandle, m.Msg, (int)m.WParam, (int)m.LParam);
return false;
}
}
public class Form1 : Form
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.listBox1 = new System.Windows.Forms.ListBox();
this.listBox2 = new System.Windows.Forms.ListBox();
this.SuspendLayout();
//
// listBox1
//
this.listBox1.FormattingEnabled = true;
this.listBox1.Items.AddRange(new object[] {
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10"});
this.listBox1.Location = new System.Drawing.Point(56, 48);
this.listBox1.Name = "listBox1";
this.listBox1.Size = new System.Drawing.Size(120, 95);
this.listBox1.TabIndex = 0;
//
// listBox2
//
this.listBox2.FormattingEnabled = true;
this.listBox2.Items.AddRange(new object[] {
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10"});
this.listBox2.Location = new System.Drawing.Point(280, 48);
this.listBox2.Name = "listBox2";
this.listBox2.Size = new System.Drawing.Size(120, 95);
this.listBox2.TabIndex = 1;
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(501, 361);
this.Controls.Add(this.listBox2);
this.Controls.Add(this.listBox1);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.ListBox listBox1;
private System.Windows.Forms.ListBox listBox2;
public Form1()
{
InitializeComponent();
Application.AddMessageFilter(new MessageFilter(listBox1.Handle, listBox2.Handle));
}
}
}