C#学习教程:在派生的C#用户控件中处理Windows通知我正在尝试处理点击通知,例如,像这样:classExtendedTreeView:TreeView{privateconstInt32NM_FIRST=(Int32)(0U-0U);privateconstInt32NM_CLICK=unchecked((Int32)((UInt32)NM_FIRST-2U));protectedoverridevoidWndProc(refMessagem){if(m.Msg==NM_CLICK){MessageBox.Show("NM_CLICK");}base.WndProc(refm);}}但消息框从未显示。这是我第一次尝试使用Win32API来修改.NET控件的行为,所以我不知道哪里出了问题。这是处理这些通知的正确方法吗?仅供参考:我知道.NETTreeView控件有一个单击事件。这只是第一次测试。稍后我想启用TVS_EX_MULTISELECT样式。由于.NETTreeView控件在启用AfterSelect时不会触发任何AfterSelect事件,因此我想稍后调查TVN_SELCHANGED和TVN_ITEMCHANGED通知的行为。事情并没有那么简单。查看MSDN文章,NM_CLICK通知作为WM_NOTIFY消息传递。它被发送到树视图的父级。Winforms有管道将其回显到原始控件,以允许消息由从TreeView和自定义事件处理派生的类处理。这是通过将0x2000(Winforms源代码中WM_REFLECT的值)添加到消息中来完成的。所以代码应该是这样的:使用System.Windows.Forms;使用System.Runtime.InteropServices;classExtendedTreeView:TreeView{protectedoverridevoidWndProc(refMessagem){if(m.Msg==WM_REFLECT+WM_NOFITY){varnotify=(NMHDR)Marshal.PtrToStructure(m.LParam,typeof(NMHDR));如果(notify.code==NM_CLICK){MessageBox.Show("yada");m.Result=(IntPtr)1;返回;}}base.WndProc(refm);}私有常量intNM_FIRST=0;私人常量intNM_CLICK=NM_FIRST-2;私人常量intWM_REFLECT=0x2000;私人常量intWM_NOFITY=0x004e;privatestructNMHDR{publicIntPtrhwndFrom;公共IntPtridFrom;公共整数代码;请注意,TreeView已经完成了所有这些工作,这就是NodeMouseClick、Click和MouseClick事件的生成方式。执行此操作的代码也适用于本机控件中的一些怪癖,因此请确保在使用它之前确实需要它。如果您想知道发生了什么,请查看参考资料。发送到控件父级的通知:通知父窗口树视图控件用户左键单击了该控件。这是通过WM_NOITIFY消息完成的。幸运的是,作者还包含了一种称为反射的机制,它允许树视图的子类也接收通知。消息是&H2000|WM_通知&H2000|WM_NOTIFY,您可以将其完全视为WM_NOTIFY。另请注意,NM_CLICK不是消息,而是包含在NMHDR结构中的通知。此通知代码以WM_NOTIFY消息的形式发送。MSDN中提到了两件重要的事情:1)msg??.lparam是指向NMHDR结构的指针2)通知被发送到父控件,因此工作代码是(编译为控制台应用程序-它将在那里打印消息):使用系统;使用System.Windows.Forms;使用System.Runtime.InteropServices;类MyTreeView:TreeView{publicTreeViewRealTreeView;publicMyTreeView(){RealTreeView=newTreeView();RealTreeView.Dock=DockStyle.Fill;Controls.Add(RealTreeView);}enumWM{NOTIFY=78}enumNM:uint{FIRST=0,NM_CLICK=unchecked(FIRST-2),NM_CUSTOMDRAW=unchecked(FIRST-12),NM_DBLCLK=unchecked(FIRST-3),NM_KILLFOCUS=unchecked(FIRST-2)8),NM_RCLICK=未选中(FIRST-5),NM_RDBLCLK=未选中(FIRST-6),NM_RETURN=未选中(FIRST-4),NM_SETCURSOR=未选中(FIRST-17),NM_SETFOCUS=未选中(FIRST-7)}[StructLayout(LayoutKind.Sequential)]structNMHDR{publicIntPtrhwndFrom;公共UIntPtridFrom;公共单位代码;}protectedoverridevoidWndProc(refMessagem){base.WndProc(refm);=(int)WM.NOTIFY){uint代码;不安全{varnmhdr=(NMHDR*)m.LParam.ToPointer();代码=nmhdr->代码;}NMnmCode=(NM)code;Console.WriteLine("WM_NOTIFY"+nmCode);}}}publicclassMyGuiClass{publicstaticvoidMain(){Formf=newForm();vartv=newMyTreeView();tv.RealTreeView.Nodes.Add("零").Nodes.Add("子零");电视。RealTreeView.Nodes.Add("一个");tv.RealTreeView.Nodes.Add("二");tv.RealTreeView.Nodes.Add("三");tv.Dock=DockStyle.Fill;f.Controls.Add(电视);应用程序运行(f);}}编辑:当然别忘了用/unsafe编译以上是C#学习教程:HandlingthewholecontentofWindowsnotificationsharinginaderivedC#usercontrol,如果对大家有用的话我还需要了解更多关于C#学习教程,希望大家多多关注~本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
