Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Класс окна


ATLANTIDO ©   (2002-04-20 20:55:00) 

Что такое класс окна (чем он определяется) и как его узнать ?
Делаю так :

procedure TForm1.Timer1Timer(Sender: TObject);
var
buffer : PChar;
H : HDC;
begin
H:=GetForegroundWindow;
GetClassName(h, buffer, sizeof(buffer));
Memo1.Lines.Add(buffer);
end;

Получаю, что имя класса любого окна - "Sfѓx:"
В чем ошибка ?


ATLANTIDO   (2002-04-21 23:06:00) [1]

Воспользовавшись этой статьей написал следующий код:

unit Unit2;
interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
Timer1: TTimer;
ListBox1: TListBox;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
function EnumProc (Wd: HWnd; Param: LongInt): Boolean; stdcall; // Обязательно stdcall !!!
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.EnumProc (Wd: HWnd; Param: LongInt): Boolean; stdcall; // Обязательно stdcall !!!
var
buffer: array [0..255] of char;
Begin
GetClassName(Wd, buffer, SizeOf(Buffer));
if Buffer<>"" then ListBox1.Items.Add(buffer);
EnumProc := TRUE;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
H : HDC;
begin
H:=GetForegroundWindow;
if H<>0 then
begin
EnumChildWindows(h, @TForm1.EnumProc, 0);
ListBox1.items.Add("----------------");
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ListBox1.Items.Clear;
end;

end.

В ListBox"e выводятся тоько "-----------";
В чем ошибка ?


Song   (2002-04-21 09:54:00) [2]

FindWindow()
GetWindowLong()


ATLANTIDO   (2002-04-20 22:24:00) [3]

Эта панель - дочернее окно (Да ?). А как получить ее хэндл ?
(GetForegoundWindow тут уже не при делах)


Anatoly Podgoretsky   (2002-04-20 22:17:00) [4]

Посмотри шпионом


ATLANTIDO   (2002-04-20 22:06:00) [5]

Еще момент : нужно запретить пользователю пользоваться меню "Вид/Панели обозревателя/Папки" IE. Так вот, имеет ли эта панель свой класс или еще какую другую уникальную хернь, по которой ее можно найти ?


Anatoly Podgoretsky   (2002-04-20 21:59:00) [6]

Ты должен шпионом определить классы окон опасных для тебя программ, но опасные программы обычно не используют уникальных классов, что бы их некоторые не ограничивали.


ATLANTIDO   (2002-04-20 21:55:00) [7]

Пишу программу ограничения действий пользователя. Вот и хотел узнать какие окна какие классы имеют, чтобы убивать опасные.
Я конечно могу и сам єто узнать, но вдруг существуют не опасные окна с точно такиме классом.


Anatoly Podgoretsky   (2002-04-20 21:52:00) [8]

ATLANTIDO © (20.04.02 21:15)
Неверно, окон класса "Edit, Button" весьма много, хочешь уникальность то будь добр позаботить о ней сам.


ION T   (2002-04-20 21:48:00) [9]

Да просто в большинстве проэктов главную форму называют MainForm, вот и получится если два таких приложения одновременно запущены, то FindWindow("TMainForm", nil) выдаст хендл окна первого запушенного из них....

А зачем надо?


ATLANTIDO   (2002-04-20 21:39:00) [10]

А где можно подробнее узнать какой класс к каким окнам относится ?


ION T   (2002-04-20 21:35:00) [11]

Низзя:(( Например TMainForm скорее всего будет во всех приложниях сделанных на Дельфи.....


ATLANTIDO   (2002-04-20 21:15:00) [12]

Т.е. класс окна можно считать уникальным для каждого окна ?


Anatoly Podgoretsky   (2002-04-20 21:13:00) [13]

Класс окна - это текст (тип/имя), которые ты сам задаешь, например для форм это имя класса.


ATLANTIDO   (2002-04-20 21:05:00) [14]

Ок ! Исправил, работает :

procedure TForm1.Timer1Timer(Sender: TObject);
var
buffer : array [0..254] of char;
H : HDC;
begin
H:=GetForegroundWindow;
GetClassName(h, buffer, sizeof(buffer));
Memo1.Lines.Add(buffer);
end;

А как быть с первой половиной вопроса ?


Anatoly Podgoretsky   (2002-04-20 21:00:00) [15]

Память будет Пушкин выделять?


Наверх

Титульная страница Поиск, карта сайта Написать письмо