Termi_uc |
Отправлено: 14.02.2007, 19:28 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 61
|
Как получит список зарегистрированых с помощью функции RegisterClass, классов???
Например:
CODE |
RegisterClass(__classid(TButton));
RegisterClass(__classid(TPanel));
|
и как теперь получить список где будут, все зарегистрированые до этого классы, а в конце эти два.
Здесь раньше написано было RegisterClass("TButton"); — бес попутал, а сам удивлялся — что никто не знает?
Отредактировано Termi_uc — 19.02.2007, 20:24
|
|
Termi_uc |
Отправлено: 20.02.2007, 19:54 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 61
|
Если RegisterClass это Win32 API, то значит и функция для получения зарегестрированых классов должнабыть Win32 API. Но я чё-то не нашел.
Может вообще невозможно получить список зарегестрированых классов?
|
|
AVC |
Отправлено: 21.02.2007, 09:35 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Windows
CODE |
RegisterClass Function
--------------------------------------------------------------------------------
The RegisterClass function registers a window class for subsequent use in calls to the CreateWindow or CreateWindowEx function.
The RegisterClass function has been superseded by the RegisterClassEx function. You can still use RegisterClass, however, if you do not need to set the class small icon.
Syntax
ATOM RegisterClass( CONST WNDCLASS *lpWndClass
);
Parameters
lpWndClass
[in] Pointer to a WNDCLASS structure. You must fill the structure with the appropriate class attributes before passing it to the function.
Return Value
If the function succeeds, the return value is a class atom that uniquely identifies the class being registered. This atom can only be used by the CreateWindow, CreateWindowEx, GetClassInfo, GetClassInfoEx, FindWindow, FindWindowEx, and UnregisterClass functions and the IActiveIMMap::FilterClientWindows method.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
Remarks
If you register the window class by using RegisterClassA, the application tells the system that the windows of the created class expect messages with text or character parameters to use the ANSI character set; if you register it by using RegisterClassW, the application requests that the system pass text parameters of messages as Unicode. The IsWindowUnicode function enables applications to query the nature of each window. For more information on ANSI and Unicode functions, see Conventions for Function Prototypes.
All window classes that an application registers are unregistered when it terminates.
Windows 95/98/Me: All window classes registered by a dynamic-link library (DLL) are unregistered when the DLL is unloaded.
Windows NT/2000/XP: No window classes registered by a DLL are unregistered when the DLL is unloaded. A DLL must explicitly unregister its classes when it is unloaded.
Windows 95/98/Me: RegisterClass fails if the cbWndExtra or cbClsExtra member of the WNDCLASS structure contains more than 40 bytes.
Windows 95/98/Me: RegisterClassW is supported by the Microsoft Layer for Unicode (MSLU). To use this version, you must add certain files to your application, as outlined in Microsoft Layer for Unicode on Windows 95/98/Me Systems.
Example
For an example, see Associating a Window Procedure with a Window Class.
Function Information
Minimum DLL Version user32.dll
Header Declared in Winuser.h, include Windows.h
Import library User32.lib
Minimum operating systems Windows 95, Windows NT 3.1
Unicode Implemented as ANSI and Unicode versions.
See Also
Window Classes Overview, CreateWindow, CreateWindowEx, FindWindow, FindWindowEx, GetClassInfo, GetClassInfoEx, GetClassName, RegisterClassEx, UnregisterClass, WindowProc, WNDCLASS
--------------------------------------------------------------------------------
© 2005 Microsoft Corporation. All rights reserved.
|
VCL
CODE |
// classes.pas
procedure RegisterClass(AClass: TPersistentClass);
var
AClassName: string;
begin
with ClassList.LockList do
try
while IndexOf(AClass) = -1 do
begin
AClassName := AClass.ClassName;
if GetClass(AClassName) <> nil then
raise EFilerError.CreateResFmt(@SDuplicateClass, [AClassName]);
Add(AClass);
if AClass = TPersistent then Break;
AClass := TPersistentClass(AClass.ClassParent);
end;
finally
ClassList.UnlockList;
end;
end;
| |
|
Termi_uc |
Отправлено: 21.02.2007, 15:36 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 61
|
QUOTE (AVC @ 21.02.2007, 09:35) |
// classes.pas
procedure RegisterClass(AClass: TPersistentClass);
var
AClassName: string;
begin
with ClassList.LockList do
try
....
finally
ClassList.UnlockList;
end;
end;
|
Я так понимаю ты предлагаеш создать экземпляр TClassList в своей прграмме. Потом перегрузить функцию RegisterClass и просто в ClassList записывать регистрируемые в программе классы.
Но это не совсем то, что я спрашивал.
Всё понял
CODE | RegisterClass(__classid(TForm1));// — не Win32 API
::RegisterClass((tagWNDCLASSA *)__classid(TForm1));// — Win32 API |
Извините, спутал ::RegisterClass с RegisterClass.
буду считать, что получить список зарегистрированых в системе классов нельзя...
|
|
AVC |
Отправлено: 21.02.2007, 16:20 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE |
буду считать, что получить список зарегистрированых в системе классов нельзя
|
Ну почему. Не делал, но думаю что EnumWindows в сочетании с GetClassInfo(Ex) позволит вам обойти все классы, зарегистрированные в системе на данный момент. |
|
Termi_uc |
Отправлено: 21.02.2007, 17:06 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 61
|
QUOTE (AVC @ 21.02.2007, 16:20) | Ну почему. Не делал, но думаю что EnumWindows в сочетании с GetClassInfo(Ex) позволит вам обойти все классы, зарегистрированные в системе на данный момент. |
О...
Я как-то, не подумал
CODE |
//Функция собирает информацию об окне и добавляет узел окна в дерево
function AddWindowToTree(wnd: HWND): TTreeNode;
var
caption, classname: String;
text: String;
node: TTreeNode;
begin
//Получение текста окна
SetLength(caption, SendMessage(wnd, WM_GETTEXTLENGTH, 0, 0) + 1);
SetLength(caption, SendMessage(wnd, WM_GETTEXT, Length(caption),
Integer(PAnsiChar(caption))));
//Имя класса окна
SetLength(classname, 1024);
SetLength(classname, GetClassName(wnd, PAnsiChar(classname), 100));
//Формирование текста для элемента и добавление его в дерево
if caption = '' then caption := '<none>';
text := caption + ' [' + classname + ']';
node := enInfo.tree.Items.AddChild( enInfo.parent, text );
node.Data := Pointer(wnd); //Не забываем запомнить дексриптор окна
AddWindowToTree := node;
end;
//Функция вызывается при нахождении нового окна
function NewWindow(wnd: HWND; param: LPARAM):BOOL; stdcall;
var
wndNode, parentNode: TTreeNode;
begin
wndNode := AddWindowToTree(wnd); //Добавление информации об окне в дерево
//Перечисление дочерних окон
parentNode := enInfo.parent;
enInfo.parent := wndNode;
EnumChildWindows(wnd, Addr(NewWindow), param);
enInfo.parent := parentNode;
//Продолжать перечисление (после перечисления всех дочерних окон)
NewWindow := TRUE;
end;
//Процедура формирования дерева (иерархии открытых окон)
procedure TfrmMain.LoadWindowsTree();
var
desktop: TTreeNode;
//enInfo: TEnumInfo;
begin
tree.Items.Clear;
//Добавление узла для Рабочего стола
desktop := tree.Items.Add(tree.Items.GetFirstNode, 'Рабочий стол');
//Перечисление окон
enInfo.tree := tree;
enInfo.parent := desktop;
EnumDesktopWindows(0, Addr(NewWindow), Integer(Addr(enInfo)));
// EnumWindows(Addr(NewWindow), Integer(Addr(enInfo)));
end;
|
Решает задачу относительно классов, экземпляры которых созданы...
А если класс зарегистрирован, но его экземпляр (окно) не создано?
Но это уже не по теме.
AVC спасибо!
Тему можно считать ЗАКРЫТОЙ
Отредактировано Termi_uc — 21.02.2007, 17:07
|
|
|