![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Класс окна
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]Память будет Пушкин выделять?