Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не дать программе открыться, средствами хука... 
:(
    Опции темы
decoder
  Дата 17.10.2004, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 18.5.2004
Где: Харьков(хохол, к сожалению)

Репутация: 1
Всего: -1



Значится, пишу прогу закрытия окна на момент его создания...
Вот код длл (закоммертированный текст - для WH_GETMESSAGE)
Код

library dll;
uses
 Windows, Messages;
var
 Hook: hHook;
function HookProc(Code: Integer; wParam: Integer; lParam: Integer): Integer; stdcall;
var
 Text: String;
begin
 if {TMsg(Pointer(lParam)^).message}Code = {WM_CREATE}HCBT_CREATEWND then
   begin
     SendMessage({TMsg(Pointer(lParam)^).hwnd}wParam, WM_GETTEXT, 255, Integer(LPCTSTR(Text)));
     if Text = 'Калькулятор' then
       SendMessage({TMsg(Pointer(lParam)^).hwnd}wParam, WM_DESTROY, 0, 0);
   end;
 Result := CallNextHookEx(Hook, Code, wParam, lParam);
end;
function SetHook(State: Boolean): Boolean; export;
 function Hooked: Boolean;
   begin
     Result := (Hook <> 0);
   end;
begin
 if State then
   begin
     if not Hooked then
       Hook := SetWindowsHookEx({WH_GETMESSAGE}WH_CBT, @HookProc, hInstance, 0);
     Result := Hooked;
   end
 else
   begin
     if Hooked then
       UnhookWindowsHookEx(Hook);
     Hook := 0;
     Result := True;
   end;
end;
exports SetHook;
begin
end.

а вот код приложения
Код

program progra;
uses
 Windows;
type
 TSetHook = function (State: Boolean): Boolean;
var
 SetHook: TSetHook;
 DLLHandle: THandle;
 Msg: TMsg;
begin
 DLLHandle := LoadLibrary(LPCTSTR('dll.dll'));
 @SetHook := GetProcAddress(DLLHandle, 'SetHook');
 if SetHook(True) then
   while GetMessage(Msg, 0, 0, 0) do
     begin
       TranslateMessage(Msg);
       DispatchMessage(Msg);
     end;
 SetHook(False);
 FreeLibrary(DLLHandle);
 Halt;
end.

Оба хука одинаково не работают. ПАМАГИТЕ!!!
--------------------
Молчать, я вас спрашиваю!
PM MAIL   Вверх
<Spawn>
Дата 18.10.2004, 05:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 1
Всего: 64



Нужно использовать WH_CBT хук


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
decoder
Дата 18.10.2004, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 18.5.2004
Где: Харьков(хохол, к сожалению)

Репутация: 1
Всего: -1



Я ж написал НЕ РАБОТАЕТ!
--------------------
Молчать, я вас спрашиваю!
PM MAIL   Вверх
<Spawn>
Дата 18.10.2004, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 1
Всего: 64



В хелпе черным по белому написано:

Цитата
Return Values

For operations corresponding to the following CBT hook codes, the return value must be 0 to allow the operation, or 1 to prevent it:
HCBT_ACTIVATE
HCBT_CREATEWND
HCBT_DESTROYWND
HCBT_MINMAX
HCBT_MOVESIZE
HCBT_SETFOCUS
HCBT_SYSCOMMAND


То есть, тебе нужно изменить результат функции хука на 1.

Код
 if Text = 'Калькулятор' then
 begin
   Result := 1;
 end;



--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
decoder
Дата 18.10.2004, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 18.5.2004
Где: Харьков(хохол, к сожалению)

Репутация: 1
Всего: -1



Вообще первоначально задумывалось изменение заголовка (вместо закрытия), т.е. просто не дать сообщению "послаться" - чуть-чуть не то...

Это сообщение отредактировал(а) decoder - 18.10.2004, 20:21
--------------------
Молчать, я вас спрашиваю!
PM MAIL   Вверх
<Spawn>
Дата 19.10.2004, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 1
Всего: 64



У тебя название темы "Не дать программе открыться ". Надо сразу конкретно излагать свои мысли.

Изменить заголовок можно при помощи функции SetWindowText:

Код
 SetWindowText(wParam, 'NewWindowText');



--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
decoder
Дата 19.10.2004, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 18.5.2004
Где: Харьков(хохол, к сожалению)

Репутация: 1
Всего: -1



У меня этот вариант вначале и был - и только потому что нифига не получилось, я и написал WM_SET/GETTEXT
--------------------
Молчать, я вас спрашиваю!
PM MAIL   Вверх
decoder
Дата 19.10.2004, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 18.5.2004
Где: Харьков(хохол, к сожалению)

Репутация: 1
Всего: -1



Во-первых: обшибся в получении заголовка (в итоге через имя класса сделал).
Во-вторых: с ВМ_ДЭСТРОЙ не работает - работает с ВМ_КЛОУЗ.
В-третих: ни "резалт := 1", ни ВМ_КЛОУЗ/ВМ_ДЭСТРОЙ не закрывают программу, а лишь окно убивают (в диспетчере отображается - иль можт я чё-та не понимаю).
То есть, проблема состоит в том, как убить программу. Как я понял, надо терминэйтить процесс, но как узнать АйДи процесса зная хэндл окна - для мня сие есть тайна великая...
--------------------
Молчать, я вас спрашиваю!
PM MAIL   Вверх
p0s0l
Дата 19.10.2004, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Цитата
как узнать АйДи процесса зная хэндл окна - для мня сие есть тайна великая...

GetWindowThreadProcessId (hwnd, ProcessID);
В ProcessID будет то что тебе надо...



--------------------
С уважением, г-н Посол.
PM   Вверх
decoder
Дата 20.10.2004, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 18.5.2004
Где: Харьков(хохол, к сожалению)

Репутация: 1
Всего: -1



Угу, пасиба!
--------------------
Молчать, я вас спрашиваю!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0595 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.