2013-03-11 1 views
5

마우스가 놓여져있을 때 양식 이름을 얻으려면 트릭을 찾고있었습니다. 내가 하나의 MDI 양식을 가지고 있고 form1, form2, form3 및 모든 sdi 양식과 같은 많은 sdi 양식이 열려 있다고 가정하십시오. form1에서 하나의 타이머가 실행 중이며 주기적으로 실행됩니다. 마우스를 SDI 양식 창에 놓았을 때 timer tick 이벤트의 form1 레이블에 양식 이름을 표시하려고합니다.마우스가 SDI 양식의 위치에있을 때 양식 이름을 감지하는 방법

이렇게하면 되겠습니다. 코드는 여기

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에 마우스를 올려 놓으면 해당 이름이 표시되지 않습니다. 나는이 코드에서 무엇이 문제인지 이해할 수 없다. 그것을 고칠 수 있도록 안내해주십시오.

+1

당신이 "마우스가에"무엇을 의미합니까? 반드시 양식을 활성화하지 않고도 마우스를 가져 가야한다는 것을 의미합니까, 아니면 양식이 어린이들, 즉 초점이 맞춰진 어린이들 사이에서 활발한 형태입니까? –

+0

제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야합니다"로 표시되어야합니다. –

답변

1

, 나는 그냥 FindForm() 기능을 사용할 필요가 있다고 생각 :

var ctl = Control.FromHandle(handle); 
if (ctl != null) { 
    var form = ctrl.FindForm(); 
    if (form != null) { 
    label1.Text = form.Name; 
    } 
} 
+0

FindForm()은 무엇을합니까 ?? – Thomas

+0

@Thomas 컨트롤의 부모에 대한 폼 인스턴스를 반환합니다. [Control.FindForm 메서드] (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.findform.aspx)를 참조하십시오. 그것은 당신이 당신의 코드로 무엇을 하려는지와 같이 들렸다. 양식의 "이름"또는 양식의 "텍스트"(제목)를 원한다면 명확하지 않습니다. 제목은'form.Name'을'form.Text'로 대체하십시오. – LarsTech

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의 이름이 비어있는 것을 볼 수 있습니다. 그러나 기다려라, 그 이상이있다!

컨트롤을 추가 할 경우 모든 컨트롤을 폼 2에 추가하면 이 생성 될 때의 이름이됩니다. 네이밍 시스템에서는 여러 컨트롤이있을 때까지 폼 컨트롤에 이름을 할당 할 필요가 없다고 느낍니다.이 컨트롤은 InitializeComponent 호출 중에 수행됩니다. 이 코드를 살펴볼 수 있습니다. 여기

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(); 

} 

, 이름 만 할당 여기에없는 컨트롤 "Form3"에 대해 생성 된 코드는 다른 컨트롤이있는 경우 양식에 추가하십시오. 이유가 무엇인지에 대해서는 자동 생성 코드를 작성한 사람에게 그 대답을 물어봐야 할 것입니다. 당신이 제어 할 수 있기 때문에

관련 문제