簡體   English   中英

如何在C#中將類實例傳遞給WndProc

[英]How to pass class instances to WndProc in C#

如何將主窗體中的對象實例傳遞給WndProc方法

例如:我有一個ComboBox對象-objCombo 而且我必須在系統繪制下拉列表框之前捕獲特定的窗口消息。

一種方法是,我可以有一個自定義的組合框,它來自ComboBox

public class CustomComboBox : ComboBox 
{
   //... some initialization code goes here

   protected override void WndProc(ref Message m)
   {
        if (m.Msg == WM_CTLCOLORLISTBOX)
        {
          // capture the message and do some work.
          //here i can get the reference to the CustomComboBox by using 
          //this keyword.
        }
   }

}

但是,我想知道有沒有一種方法可以執行此操作,而無需完成創建自定義組合框的過程並完全相同。 即使用對組合框實例的引用將Windows消息捕獲到我的Form類中。

public class MyForm : Form
{
   //... some initialization code goes here including the InitializeComponent 
   // for form objects and other controls 

   private void CaptureComboWndProc(ref Message m)
   {
     // this method will capture only the windows message specific to objCombo ??
   }

}

我希望我對“謝謝和干杯VATSA”這個問題很清楚

更好的方法是創建組合框的后代。 這是非常清楚的方法。

但是,您可以從消息中找到控件,方法如下。

使用Control.FromHandle查找將消息發布到的控件。

   protected override void WndProc(ref Message m)
   {
        if (m.Msg == WM_CTLCOLORLISTBOX)
        {
            if(Control.FromHandle(m.HWnd) == this.objCombo)
            {
                CaptureComboWndProc(ref m);
            }
        }
   }

   private void CaptureComboWndProc(ref Message m)
   {

   }

並且...最后我想說要這樣做。

在Windows GUI編程中,通用技術可能被稱為“對窗口進行子分類”。 它通過替換窗口的窗口過程來工作。 您已經在工具箱中找到的每個本機窗口控件(ListView,ComboBox等)都已完成此操作,這就是它們引發事件的方式。 並且可以重復進行。 無需調用,NativeWindow類通過其AssignHandle()方法支持它。

您必須從NativeWindow派生自己的類,並重寫WndProc()方法以實現自定義消息處理。 使用例如表單的Load事件來附加它。 大致:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
    }

    private class ComboHooker : NativeWindow {
        protected override void WndProc(ref Message m) {
            if (m.Msg == 0x134) {
                // etc...
            }
            else {
                // Stop sub-classing on WM_NCDESTROY
                if (m.Msg == 0x82) this.ReleaseHandle();
                base.WndProc(ref m);
            }
        }
    }

    private void hookComboBoxes(Control.ControlCollection ctls) {
        foreach (Control ctl in ctls) {
            if (ctl.GetType() == typeof(ComboBox)) {
                new ComboHooker().AssignHandle(ctl.Handle);
            }
            hookComboBoxes(ctl.Controls);
        }
    }

    protected override void OnLoad(EventArgs e) {
        hookComboBoxes(this.Controls);
        base.OnLoad(e);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM