如何在c# winforms中传递一个事件给另一个控件

本文关键字:一个 事件 控件 另一个 winforms | 更新日期: 2023-09-27 18:07:51

我想传递一个事件(MouseWheel)从一个控件到另一个。当第一个控件捕获事件时,它应该调用第二个控件上此事件的默认处理程序。这是我尝试做的伪代码。

void Control1_MouseWheel(object sender, MouseEventArgs e)
{
   //do something
   Control2_MouseWheel(sender,e);
}

编辑:Control2是一个COM接口,它的处理程序不是写的。

如何在c# winforms中传递一个事件给另一个控件

您可以设置两个控件具有相同的事件处理程序。(由设计器或代码)

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

   }
}