It works fine for me, if there is a Button at the appropriate point.
I'd change it slightly and use
as
instead myself (or you could get casting exceptions):
Point p = new Point(64, 46);
Control c = GetChildAtPoint(p);
Button btn1 = c as Button;
if (btn1 != null)
{
MessageBox.Show(btn1.Text);
}
Assuming there is a button at the point, it should work, but put a breakpoint on the first line of the code and step through looking at the variables - you need to know what GetChildAtPoint is returning is there is a problem.