Получить дескриптор части редактирования NumericUpDown - PullRequest
1 голос
/ 28 ноября 2011

A NumericUpDown имеет 2 дескриптора / элемента управления: внешний spinbox и внутренний элемент управления, похожий на текстовое поле редактирования.

Мне нужно получить дескриптор внутреннего элемента управления textbox.NumericUpDown.Handle дает внешнюю ручку.

Самое близкое, что я нашел в Google к этому, - это этот форумный разговор .Хитрость заключается в том, чтобы использовать сообщение UDM_GETBUDDY = WM_USER+106 = 0x0400+106, которое возвращает дескриптор окна собеседника, в нашем случае это текстовое редактирование.

Сначала вывод был примерно таким:

control.Capture = true;
IntPtr outer = User32.GetCapture();
IntPtr inner = new IntPtr(User32.SendMessage(outer, (0x0400 + 106), 0, 0));

Но затем ОП сказал, что это не работает, поэтому кто-то предложил использовать GetWindow(outer, GW_CHILD).где GW_CHILD = 5

control.Capture = true;
IntPtr outer = User32.GetCapture();
IntPtr inner = User32.GetWindow(outer, 5);

Для обоих этих методов я всегда получаю inner = 0, что, очевидно, не является правильным ответом.Тем не менее, описанный OP метод 2, похоже, сработал, поэтому я могу что-то делать не так.

Кстати, механизм «захвата» кажется бесполезным, поскольку я могу просто использовать:

IntPtr outer = control.Handle;

Который возвращает то же самое.

Итак, есть идеи, как получить дескриптор внутреннего текстового поля?

1 Ответ

2 голосов
/ 28 ноября 2011

В Winforms реализовано по-разному, без контроля друзей.Получить ссылку на часть текстового поля легко, хотя это нарушает несколько правил инкапсуляции.Не проблема, NumericUpDown заморожен во времени и никогда не изменится.

        var box = (TextBox)numericUpDown1.Controls[1];

Будьте осторожны, выбирая свойства для этого элемента управления TextBox, не все его события реализованы.

...