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


Автор: decoder 17.10.2004, 19:48
Значится, пишу прогу закрытия окна на момент его создания...
Вот код длл (закоммертированный текст - для 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.

Оба хука одинаково не работают. ПАМАГИТЕ!!!

Автор: <Spawn> 18.10.2004, 05:28
Нужно использовать WH_CBT хук

Автор: decoder 18.10.2004, 17:22
Я ж написал НЕ РАБОТАЕТ!

Автор: <Spawn> 18.10.2004, 19:59
В хелпе черным по белому написано:

Цитата
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;

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

Автор: <Spawn> 19.10.2004, 10:43
У тебя название темы "Не дать программе открыться ". Надо сразу конкретно излагать свои мысли.

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

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

Автор: decoder 19.10.2004, 17:23
У меня этот вариант вначале и был - и только потому что нифига не получилось, я и написал WM_SET/GETTEXT

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

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

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

Автор: decoder 20.10.2004, 14:53
Угу, пасиба!

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