5

当鼠标放在表单上时,我正在寻找获取表单名称的技巧。假设我有一个 mdi 表单和许多 sdi 表单,例如 form1、form2、form3,并且所有 sdi 表单都已打开。假设我在 form1 上运行了一个计时器,它将定期运行。当鼠标放在任何 SDI 表单窗口上时,我想在 form1 的标签上显示来自计时器滴答事件的表单名称。

这种方式我尝试做到这一点。这是代码

private void timer1_Tick(object sender, EventArgs e) {
    var handle = WindowFromPoint(Cursor.Position);
    if (handle != IntPtr.Zero) {
        var ctl = Control.FromHandle(handle);
        if (ctl != null) {
            label1.Text = ctl.Name;
            return;
        }
    }
    label1.Text = "None";
}

[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern IntPtr WindowFromPoint(Point pos);

上面的代码运行完美,但有一些小故障。当我将鼠标放在 MDI 表单或 Form1 上时,表单名称会显示在 form1 上,但是当我将鼠标放在 Form2 或 Form2 上时,它们的名称不会显示。我无法理解这段代码中有什么问题。请指导我修复它。

4

2 回答 2

1

既然你有控制权,我想你只需要使用这个FindForm()功能:

var ctl = Control.FromHandle(handle);
if (ctl != null) {
  var form = ctrl.FindForm();
  if (form != null) {
    label1.Text = form.Name;
  }
}
于 2013-03-11T16:53:48.303 回答
0

Form2 的名称未显示的原因是您创建的 Form2 实例没有名称。为了演示这一点,请查看位于 Program.cs 文件中的以下代码块:

MDIParent mdi = new MDIParent();
Form1 frm1 = new Form1();
frm1.MdiParent = mdi;
Form2 frm2 = new Form2();
frm2.MdiParent = mdi;
frm1.Show();
frm2.Show();
Application.Run(mdi);

如果添加断点,您将看到 Form2 的名称为空。但是等等,还有更多!

如果您将控件(任何控件)添加到 Form 2,那么在您创建它时它就会有一个名称看起来命名系统在存在多个控件之前不需要为表单控件分配名称,它在InitializeComponent调用期间会这样做。你可以看看这段代码。这是为没有控件的“Form3”生成的代码:

private void InitializeComponent()
{
    this.components = new System.ComponentModel.Container();
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
    this.Text = "Form3";
}

这是添加标签后的相同形式:

private void InitializeComponent()
{
    this.label1 = new System.Windows.Forms.Label();
    this.SuspendLayout();
    // 
    // label1
    // 
    this.label1.AutoSize = true;
    this.label1.Location = new System.Drawing.Point(13, 13);
    this.label1.Name = "label1";
    this.label1.Size = new System.Drawing.Size(35, 13);
    this.label1.TabIndex = 0;
    this.label1.Text = "label1";
    // 
    // Form3
    // 
    this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
    this.ClientSize = new System.Drawing.Size(284, 262);
    this.Controls.Add(this.label1);
    this.Name = "Form3";
    this.Text = "Form3";
    this.ResumeLayout(false);
    this.PerformLayout();

}

如您所见,仅当存在其他控件时,才会为表单分配名称。至于为什么会这样,您可能不得不向编写自动生成代码的人询问该答案。

于 2013-03-11T16:27:05.453 回答