Получить Handle списка TComboBoxDelphi , Компоненты и Классы , СпискиПолучить Handle списка TComboBox
Оформил: DeeCo procedure TForm1.ComboBox1DropDown(Sender: TObject); begin PostMessage(Handle, COMBO_MSG, 0, 0); end; function EnumProc(wnd: HWND; Alabel: TLabel): BOOL; stdcall; var buffer: array[0..50] of Char; begin Result := True; if IsWindowVisible(wnd) then begin GetClassName(wnd, buffer, SizeOf(buffer)); if StrIComp(buffer, 'ComboLBox') = 0 then begin Alabel.Caption := Format('handle found: %x', [wnd]); Result := False; end; end; end; procedure TForm1.ComboBoxMessage(var Msg: TMessage); begin EnumThreadWindows(GetCurrentThreadID, @EnumProc, Integer(label1)); end; Программный код, который вы предоставили, предназначен для захвата handles списка (list box) внутри комбо-бокса (combo box). Вот подробное описание каждого элемента: ComboBox1DropDown Эта функция-обработчик событий DropDown для контрола ComboBox. Когда это событие происходит, она отправляет сообщение в указанный handle окна с помощью PostMessage. Сообщение - COMBO_MSG (которое не определено в вашем коде, но, вероятно, это пользовательское сообщение). EnumProc Это callback-функция, используемая функцией EnumThreadWindows для обработки каждого окна в текущем потоке. Она принимает два параметра: wnd (handle окна) и Alabel (TLabel-контроль, который будет отображать результат). Функция возвращает булевое значение, указывающее, продолжать ли перечисление окон. Внутри функции она проверяет, является ли окно видимым с помощью IsWindowVisible. Если это так, она получает имя класса окна с помощью GetClassName и сравнивает его с 'ComboLBox' (которое, вероятно, является именем класса списка внутри комбо-бокса). Если найден совпад, она устанавливает заголовок TLabel-контроля для отображения handle окна и возвращает False, чтобы остановить перечисление окон. ComboBoxMessage Процедура получает сообщение из EnumThreadWindows и вызывает EnumProc для обработки каждого окна в текущем потоке. Она передает сообщение и TLabel-контроль как параметры EnumProc. В целом, код предназначен для поиска handle списка внутри комбо-бокса путем перечисления окон в текущем потоке и проверки их имен классов. Однако я хотел бы предложить альтернативное решение, которое может быть более эффективным и точным: Вместо использования EnumThreadWindows и отправки сообщений, вы можете использовать функцию Windows API GetComboBoxInfo для получения информации о комбо-боксе, включая handle списка. Вот пример кода:
Функция возвращает handle списка внутри комбо-бокса с помощью GetComboBoxInfo. Вы можете использовать этот handle для манипуляции списком, как вам нужно. В статье описывается способ получения Handle списка TComboBox в Delphi с помощью обработчика сообщения и функции EnumProc, которая перебирает окна и находит класс ComboLBox. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |