マウスを置いたときにフォーム名を取得するトリックを探していました。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 に置くと名前が表示されません。このコードの何が問題なのか理解できません。それを修正するために私を案内してください。