当鼠标位于任何SDI表单上时,如何检测表单名称

Tho*_*mas 5 c# winapi winforms

当鼠标放在上面时,我正在寻找获取表单名称的技巧.假设我有一个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);
Run Code Online (Sandbox Code Playgroud)

上面的代码运行完美,但有一些小故障.当我将鼠标放在MDI表单或Form1上时,表单名称显示在form1上,但是当我将鼠标放在Form2或Form2上时,他们的名字没有显示.我无法理解此代码中的问题.请指导我解决它.

Lar*_*ech 1

既然您拥有控制权,我认为您只需要使用该FindForm()功能:

var ctl = Control.FromHandle(handle);
if (ctl != null) {
  var form = ctrl.FindForm();
  if (form != null) {
    label1.Text = form.Name;
  }
}
Run Code Online (Sandbox Code Playgroud)