Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Узнать о создании нового окна в приложении


Автор: Akella 14.1.2008, 09:53
Мне нужно менять заголовок каждого окна в приложении. Как можно узнать, что в приложении создаётся новое окно и поменять его заголовок в момент создания?

Автор: Alexeis 14.1.2008, 10:32
Перехватить функции CreateWindow, CreateWindowEx и их юникодные варианты. 

Автор: remax 14.1.2008, 10:33
А в чем прикол? Akella, приложение твое? Значит ты сам создаешь окна. Почему ты не можешь в этот момент поменять его заголовок? Уточни, пожалуйста...

Автор: ama_kid 14.1.2008, 10:34
Если имеется ввиду вообще всех окон  - тогда наверное поможет http://msdn2.microsoft.com/en-us/library/ms644990.aspx с отловом http://msdn2.microsoft.com/en-us/library/ms644977(VS.85).aspx и модификацией заголовка окна в структуре http://msdn2.microsoft.com/en-us/library/ms644962(VS.85).aspx...

Автор: Akella 14.1.2008, 11:00
remax, мне лень в 20-30 окнах прописывать код изменения заголовка, а если код измениться, опять менять?

Добавлено через 1 минуту и 13 секунд
Alexeis, а можно пример, я никогда не перехватывал сообщения  smile 

Автор: remax 14.1.2008, 11:02
А в каждом и не надо - сделай общего предка...

Автор: Akella 14.1.2008, 11:07
помоему легче перехватывать CreateWindow, CreateWindowEx smile 

Автор: remax 14.1.2008, 11:19
Если проблема одноразовая, то без разницы. И вполне можно согласится с тобой, что в этом случае использовать хуки проще. А если необходимо реализовывать и в дальнейшем, то лучше через форму-прототип. Ее даже не обязательно заносить в репозитарий. Кинул в каталог проекта. И для свои обычных форм просто заменил предка, например
Код

TMainForm = class(TForm)
 
на
Код

TMainForm = class(TMyCustomForm)
.  smile 

Особенно такой подход привлекает, если у форм твоего приложения есть еще общие особенности.

Автор: Akella 14.1.2008, 11:34
мне бы так, чтобы в каждом модуле код не прописывать

Автор: VICTAR 14.1.2008, 12:13
Из drkb
Код

unit Unit2;

 interface

 uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

 type

TForm2 = class(TForm)

private

{Private declarations}

public

   constructor CreateWithCaption(aOwner: TComponent; aCaption: string);

{Public declarations}

end;

var

Form2: TForm2;

 implementation

{$R *.DFM}


constructor TForm2.CreateWithCaption(aOwner: TComponent; aCaption: string);
begin
 Create(aOwner);
 Caption := aCaption;
end;

uses Unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Unit2.Form2 := Unit2.TForm2.CreateWithCaption(Application, 'My Caption');
 Unit2.Form2.Show;
end;


Автор: remax 14.1.2008, 12:18
Пример программы, которая блокирует окна «Открыть» и «Сохранить как», а также запрещает открытие меню кнопки Пуск по нажатию Ctrl-Esc и кнопки Windows.

Код


Program HookCreateWindow;
uses Windows;

var HookHandle: hHook;

///////////////////////////////////////////////////////////////////////
//Ловушка WH_CBT (Computer Base Training - блокировки для обучающих программ)
function CBTProc(Code: integer; WParam: word; LParam: Integer): Longint; stdcall;

type PCBT_CREATEWND=^CBT_CREATEWND;
var s: pchar;
var z: PCBT_CREATEWND;
var ok: Integer;
begin
     if Code<0 then begin
       Result := CallNextHookEx(HookHandle, code, WParam, LParam);
       exit;
     end;

      case Code of
        HCBT_CREATEWND: begin //Перехватываем создание окна

          z:=PCBT_CREATEWND(LParam);

          //Получаем заголовок окна
          s:=z.lpcs.lpszName;


          if s<>nil then begin

          ok:=0;

          //Сравнение заголовка окна и подстроки
          if s^<>'О' then ok:=1; inc(s);
          if s^<>'т' then ok:=1; inc(s);
          if s^<>'к' then ok:=1; inc(s);
          if s^<>'р' then ok:=1; inc(s);
          if s^<>'ы' then ok:=1; inc(s);
          if s^<>'т' then ok:=1; inc(s);
          if s^<>'ь' then ok:=1; inc(s);
                  if s^<>#0  then ok:=1;



          if ok=0 then begin //Если подстрока найдена..
            Result:=1; //.. то запрещаем открытие окна
            exit;
          end;

          end;

        end;// HCBT_CREATEWND:

        HCBT_SYSCOMMAND: begin
          case WParam of

            //Блокируем меню Пуск по Ctrl-Esc и клавише Windows
            SC_TASKLIST: begin
              Result:=1; //Запрещаем действие
              exit;
            end;

          end;//case WParam

        end; // HCBT_SYSCOMMAND:
      end;//case

    Result := 0;//Разрешаем действие
end;

///////////////////////////////////////////////////////////////////////
begin
  //Устанавливаем ловушку на сообщения WH_CBT
  HookHandle := SetWindowsHookEx(WH_CBT, @CBTProc, HInstance, 0);

  if HookHandle<=0 then begin
    MessageBox(0,'Ошибка - ловушка не была установлена!','HookCreateWindow',MB_ICONERROR);
    Exit;
  end;

 MessageBox(0, 'Ловушка установлена. Проверьте диалоги открытия и записи файла.', 'HookCreateWindow', MB_ICONINFORMATION);

  //Убираем ловушку
  if HookHandle <> 0 then
    UnhookWindowsHookEx(HookHandle);

 MessageBox(0, 'Ловушка снята. Диалоги открытия и записи файла снова доступны.', 'HookCreateWindow', MB_ICONINFORMATION);
end.


взято с http://www.kb.mista.ru/article.php?id=55

Добавлено через 12 минут и 26 секунд
Дополнительно посмотреть:
http://delphikingdom.ru/asp/answer.asp?IDAnswer=38714
http://www.delphimaster.ru/articles/hooks/index.html
http://www.delphisources.ru/pages/faq/base/set_hook.html
http://www.realcoding.net/article/view/928

Автор: Akella 14.1.2008, 12:30
VICTAR, так это ж нудно в каждом модуле писать код

Автор: VICTAR 14.1.2008, 13:53
Я имел ввиду

Цитата(remax @  14.1.2008,  11:19 Найти цитируемый пост)
Ее даже не обязательно заносить в репозитарий. Кинул в каталог проекта. И для свои обычных форм просто заменил предка, например


Автор: MetalFan 14.1.2008, 14:50
Цитата(remax @  14.1.2008,  12:18 Найти цитируемый пост)
          //Сравнение заголовка окна и подстроки
          if s^<>'О' then ok:=1; inc(s);
          if s^<>'т' then ok:=1; inc(s);
          if s^<>'к' then ok:=1; inc(s);
          if s^<>'р' then ok:=1; inc(s);
          if s^<>'ы' then ok:=1; inc(s);
          if s^<>'т' then ok:=1; inc(s);
          if s^<>'ь' then ok:=1; inc(s);
                  if s^<>#0  then ok:=1;

жэСТЬ

Автор: remax 14.1.2008, 16:14
Цитата(MetalFan @  14.1.2008,  14:50 Найти цитируемый пост)
жэСТЬ 

Все вопросы и претензии к автору http://www.kb.mista.ru/article.php?id=55   smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)