Я не думаю, что это лучший подход, но это что-то.
В этом конкретном случае вы можете найти все обработчики в форме и затем изменить тот, который вам нужен.
var iHandle = Win32.FindWindow(null, "Form1");
var allItems = Win32.GetAllChildrenWindowHandles((IntPtr)iHandle, int.MaxValue);
Win32.SendMessage(allItems[1], 0x000c, 0, lParam: "Now you can change the text!");
Я тестировал, и allItems [1] всегда будет одним и тем же элементом, я думаю, что это порядок, в котором элементы упорядочены в winForm сверху вниз.
Я использую второйкласс для методов Win:
public class Win32
{
public const int WM_SETTEXT = 0X000C;
public static List<IntPtr> GetAllChildrenWindowHandles(IntPtr hParent, int maxCount)
{
var result = new List<IntPtr>();
int ct = 0;
IntPtr prevChild = IntPtr.Zero;
IntPtr currChild = IntPtr.Zero;
while (true && ct < maxCount)
{
currChild = FindWindowEx(hParent, prevChild, null, null);
if (currChild == IntPtr.Zero) break;
result.Add(currChild);
prevChild = currChild;
++ct;
}
return result;
}
[DllImport("user32.dll")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("User32.dll")]
public static extern int FindWindow(string strClassName, string strWindowName);
}
Редактировать: Метод получения дескрипторов всех дочерних окон, взятых из: https://jamesmccaffrey.wordpress.com/2013/02/03/getting-all-child-window-handles-using-c-pinvoke-findwindowex/