На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Изменить имя класса окна во время выполнении программы
    Доброго времени суток всем. Допустим класс моей формы называется TForm1. Хочу сменить это название на абсолютно любое прямо при выполнении программы. Как это сделать?
    Сообщение отредактировано: Alexander N -
      Зачем?
        ДЛя защиты от закрытия с помощью другой проги.
          По идее никак ...
            А название класса хранится в памяти как строка? Если да, то как ее найти?
              Цитата Alexander N @
              ДЛя защиты от закрытия с помощью другой проги.


              Я бы смотрела не в сторону затруднения нахождения (если окно есть - найдут все равно),
              а в сторону собственного "незакрывания" на стандартные команды.
              (Если закрывать будут силовыми методиками, то против лома... :) )
                Alexander N
                Цитата
                как ее найти?

                С такими запросами - что вы тут делаете? Вам - в ядро :)
                  Цитата Alexander N @
                  А название класса хранится в памяти как строка? Если да, то как ее найти?

                  Цитата kero_xmemor @
                  Alexander N

                  Цитата
                  как ее найти?

                  С такими запросами - что вы тут делаете? Вам - в ядро


                  Эмн... Стесняюсь спросить... А в какое ядро ? :blush:
                  :)
                    Цитата kero_xmemor @
                    Alexander N
                    Цитата
                    как ее найти?

                    С такими запросами - что вы тут делаете? Вам - в ядро :)

                    [offtop]как в какое? в ядерное конечно :lol: [/offtop]
                      Имена классов окон хранятся в таблице атомов в ядре.
                      Кое-что полезное можно почерпнуть из этой статьи: Инжект: лезем через окно
                      Ещё плагин Phantom как-то изменяет класс окна отладчика OllyDebug, можно его поковырять, посмотреть реализацию
                        Цитата Lumen @
                        Имена классов окон хранятся в таблице атомов в ядре.
                        Кое-что полезное можно почерпнуть из этой статьи: Инжект: лезем через окно
                        Ещё плагин Phantom как-то изменяет класс окна отладчика OllyDebug, можно его поковырять, посмотреть реализацию


                        И какой только гадости в ядро не понапихали :)
                        Век живи - век учись.
                        Спасибо :)
                          Цитата Alexander N @
                          Допустим класс моей формы называется TForm1. Хочу сменить это название на абсолютно любое прямо при выполнении программы. Как это сделать?

                          Можно просто изменить название класса окна до его регистрации\создания. Для этого достаточно переопределить метод TForm1.CreateParams
                          ExpandedWrap disabled
                            type
                              TForm1 = class(TForm)
                              ...
                              protected
                                procedure CreateParams(var Params: TCreateParams); override;
                              end;
                             
                            procedure TForm1.CreateParams(var Params: TCreateParams);
                            begin
                              inherited CreateParams(Params);
                              Params.WinClassName:='Abracadabra';
                            end;


                          Добавлено
                          Цитата Alexander N @
                          ДЛя защиты от закрытия с помощью другой проги

                          Если имеется ввиду закрытие через посылку сообщений WM_CLOSE или WM_SYSCOMMAND, то также можно переопределить метод TForm1.WndProc или заменить WindowProc, в котором игнорировать указанные сообщеня, если они посланы не из твоего главного потока: InSendMessage = true
                            Я вообще подумал что автор хочет изменить класс уже существующего окна. :) А так да, при создании можно подменить название на любое. Если окно не свое, то можно ещё перехватить RegisterClass.
                            ЗЫ: Кроме WM_CLOSE и подобных ещё придется сделать что-то с TerminateProcess
                              Цитата leo @
                              Можно просто изменить название класса окна до его регистрации\создания
                              Как вариант очень годится, хотя предполагалось изначально менять имя рендомно по таймеру.
                              Цитата Lumen @
                              Кроме WM_CLOSE и подобных ещё придется сделать что-то с TerminateProcess
                              Это тоже будет.
                              Цитата leo @
                              Если имеется ввиду закрытие через посылку сообщений WM_CLOSE или WM_SYSCOMMAND, то также можно переопределить метод TForm1.WndProc или заменить WindowProc, в котором игнорировать указанные сообщеня, если они посланы не из твоего главного потока: InSendMessage = true
                              А сообщения от системы? ПРи завершени работы к примеру.

                              ВАжное замечание: из-за недостатка материала просьба не ограничиваться только Delphi, если это можно сделать на другом языке.
                              Сообщение отредактировано: Alexander N -
                                При завершении работы компьютера в целом?
                                Тогда надо перехватывать WM_QUERYENDSESSION
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.0811 ]   [ 15 queries used ]   [ Generated: 13.05.26, 13:14 GMT ]