C# 禁用的控件工具提示在Windows窗体的组框内不起作用?

C# 禁用的控件工具提示在Windows窗体的组框内不起作用?,c#,asp.net,.net,windows,winforms,C#,Asp.net,.net,Windows,Winforms,我正在尝试显示禁用控件的工具提示。我可以在窗体鼠标移动事件中执行它,即使它工作正常 http://stackoverflow.com/questions/491267/how-can-i-show-a-tooltip-on-a-disabled-button 但是,当我为组框内的控件执行此操作时,它不起作用 需要帮助吗 我正在使用的代码 private void Form1_MouseMove(object sender, MouseEventArgs e) { var parent

我正在尝试显示禁用控件的工具提示。我可以在窗体鼠标移动事件中执行它,即使它工作正常

http://stackoverflow.com/questions/491267/how-can-i-show-a-tooltip-on-a-disabled-button
但是,当我为组框内的控件执行此操作时,它不起作用

需要帮助吗

我正在使用的代码

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
    var parent = sender as Control;
    if (parent == null)
    {
        return;
    }
    var ctrl = parent.GetChildAtPoint(e.Location);
    if (ctrl != null && !ctrl.Enabled)
    {
        if (ctrl.Visible && toolTip1.Tag == null)
        {
            var tipstring = "My tooltip";// toolTip1.GetToolTip(ctrl);
            toolTip1.Show(tipstring, ctrl, ctrl.Width / 2, ctrl.Height / 2);
            toolTip1.Tag = ctrl;
        }
    }
    else
    {
        ctrl = toolTip1.Tag as Control;
        if (ctrl != null)
        {
            toolTip1.Hide(ctrl);
            toolTip1.Tag = null;
        }
    }
}
当我将控件放置在组框外部时,它工作,但当我将控件放置在组框内部时,它不工作


我刚刚调试了代码,得到的Form1_MouseMove事件对Groupbox中的控件不起作用;它采用的是groupbox的位置,而不是控件在group box中的位置

希望可以使用groupBox1_鼠标覆盖来实现这一点……让任何人都可以使用它来获取group box的控件。

如果需要一些全局鼠标移动,请尝试使用类似这样的IMessageFilter

public partial class Form1 : Form, IMessageFilter {
   public Form1(){
      InitializeComponent();
      Application.AddMessageFilter(this);
   }
   public bool PreFilterMessage(ref Message m){
     if(m.Msg == 0x200){//WM_MOUSEMOVE = 0x200
       ShowToolTip(Control.FromHandle(m.HWnd));
     }
     return false;
   }
   private void ShowToolTip(Control ctrl){
        if (ctrl != null && !ctrl.Enabled)
        {
            if (ctrl.Visible && toolTip1.Tag == null)
            {
                var tipstring = "My tooltip";// toolTip1.GetToolTip(ctrl);
                toolTip1.Show(tipstring, ctrl, ctrl.Width / 2, ctrl.Height / 2);
                toolTip1.Tag = ctrl;
            }
        }
        else
        {
            ctrl = toolTip1.Tag as Control;
            if (ctrl != null)
            {
                toolTip1.Hide(ctrl);
                toolTip1.Tag = null;
            }
        }
   }
}

注意:我想您的原始代码可以正常工作。虽然我认为这不好。

GroupBox会吞下父窗体上的MouseMove,因此@King King的全局MouseMove处理程序应该可以工作,但有一个更简单的解决方案,这有点极端

即使设计师没有在groupbox上提供MouseMove事件,它仍然存在

只需添加load或Showed事件构造函数就可以了

groupBox.MouseMove += GroupBox_MouseMove;
您还可以获取工具提示文本集。G在designer中,并设置:

string toolTipString = toolTip.GetToolTip(control);

如果您需要它同时适用于父窗体和groupbox,您可以向多个控件添加相同的事件处理程序。

我刚刚调试了代码,得到Form1\u MouseMove事件不适用于groupbox内的控件。基本上,var ctrl=parent.GetChildAtPointe.Location;它获取的是组框的位置,而不是组框内控件的位置。谢谢您的代码,但是您在哪里使用了PreFilterMessage…如何用它标记control@RahulChowdhuryPreFilterMessage不是为手动调用而设计的,它是由底层类自动调用的。你试过我的代码了吗?@RahulChowdhury我错过了表单构造函数中的一行代码,请参阅更新。我们需要AddMessageFilter。谢谢你的回复…但它不起作用..我在一个组框中使用了两个按钮。在表单加载中,我放置了按钮。Enable=false..然后我执行你在这里执行的操作..我已调试它…它没有进入if ctrl!=空&!ctrl.Enabled条件..那么m.Msg==0x200有什么用?