Вопрос про Win API-функции

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Climber
постоялец
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Вопрос про Win API-функции

Сообщение Climber »

Не знаю, где надо стпрашивать - здесь или в подфоруме Free Pascal Compiler.
Есть такой код:

Код: Выделить всё

 TMainForm = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
 end;

var
  MainForm: TMainForm;

implementation

procedure TMainForm.Button1Click(Sender: TObject);
var
  WinClass: array[0..255] of Char;
begin
  GetClassName(MainForm.Handle, WinClass, SizeOf(WinClass));
  ShowMessage('Класс окна: '+WinClass);
end;
После нажатия на кнопку появляется сообщение: "Класс окна: Window".
Есть мнение, и не только мое, что функция GetClassName должна была тут вернуть "TMainForm". Это Lazarus виноват или что (кто)?
Павел Ишенин
постоялец
Сообщения: 475
Зарегистрирован: 24.03.2007 09:16:52

Сообщение Павел Ишенин »

Мнение неправильное :) Класс выдается окна а не контрола. Используйте MainForm.ClassName.
Climber
постоялец
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Сообщение Climber »

А вот и нет!
Я немного модифицировал (но не принципиально) одну строчку:

Код: Выделить всё

GetClassName(GetActiveWindow, WinClass, SizeOf(WinClass));

Так как мое окно активно в момент нажатия на кнопку, то все должно быть нормально.
Участники соревнований: Lazarus 0.9.26, Delphi 2007. Ответ первого - Window, второго - TMainForm.
На самом деле, мне нужно перечисление классов всех запущенных окон (через EnumWindows), чтобы некоторые отслеживать. Так вот меня просто смутило то, как программа опознала сама себя, но это в моем случае не важно.
Ушел думать...
Аватара пользователя
Alexx2000
постоялец
Сообщения: 490
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи
Контактная информация:

Сообщение Alexx2000 »

Climber писал(а):После нажатия на кнопку появляется сообщение: "Класс окна: Window".
Есть мнение, и не только мое, что функция GetClassName должна была тут вернуть "TMainForm". Это Lazarus виноват или что (кто)?

Да виноват Lazarus, он при создании всех окон использует имя класса окна "Window", Delphi устанавливает имя класса в соответствие с именем класса формы.
Это создает проблемы, если необходимо использовать определенное имя класса для окна. Может кто подскажит как решить такую проблему?
Павел Ишенин
постоялец
Сообщения: 475
Зарегистрирован: 24.03.2007 09:16:52

Сообщение Павел Ишенин »

Что дает регистрация нового класса окна windows полезного кроме идентификации по имени класса в delphi?
Михаил Крамер
новенький
Сообщения: 73
Зарегистрирован: 08.02.2008 13:26:40

Сообщение Михаил Крамер »

А кто мешает LCL изменить под себя? Тем более, по-моему, изменение имени класса сильно не скажется на работоспособности.
Павел Ишенин
постоялец
Сообщения: 475
Зарегистрирован: 24.03.2007 09:16:52

Сообщение Павел Ишенин »

Если это нужно для каких-либо целей кроме как идентификации по имени класса - это не сложно добавить в LCL, но только ради идентификации мне кажется не стоит.
Аватара пользователя
Alexx2000
постоялец
Сообщения: 490
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи
Контактная информация:

Сообщение Alexx2000 »

Мне например это нужно для более полной поддержки плагинов от Total Commander. Дело в том что некоторые плагины выполняют поиск окна главной программы по имени класса окна, и не находя его либо работают со сбоями, либо вообще не работают.
Climber
постоялец
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Сообщение Climber »

А мне вообще не нужно, я просто так спросил 8)
Кстати, после нескольких месяцев ковыряния в лазарусе запустил Delphi 2007, потыркался... Не понравилось, тупой он какой-то. Компонентов много, а току мало, лазарус приятнее 8)
Ответить