5

マウスを置いたときにフォーム名を取得するトリックを探していました。1 つの mdi フォームと、form1、form2、form3 のような多数の sdi フォームがあり、すべての sdi フォームが開かれているとします。form1 で実行されているタイマーが 1 つあり、定期的に実行されるとします。マウスが任意の 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 に答える