Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.04.07;
Скачать: [xml.tar.bz2];

Вниз

Ловушка на создание окна   Найти похожие ветки 

 
Cosmic   (2003-02-07 18:56) [0]

Мастера! Никогда не работал с ловушками, поэтому буду очень благодарен за рабочий пример. Задача следующая: нужно поставить ловушку на создание окна, чтобы не допустить его открытия. Не искать при этом хендл, не посылать закрывающее сообщение, а просто не допустить открытия. Подскажите, пожалуйста, как...


 
}{enon   (2003-02-07 19:37) [1]

А что за окно?


 
Cosmic   (2003-02-07 21:11) [2]

"Диспетчер задач Windows" :)


 
DVM   (2003-02-07 22:47) [3]

Ловушка тут не обязательна - можно по таймеру получать список окон и искать в нем нужное.


 
Ich Hasse   (2003-02-07 23:44) [4]

2 DVM таймер нельзя, есть шанс открытия окна (пусть ненадолго)... Не ставить же ради этого Multimedia Timer


 
Cosmic   (2003-02-08 08:04) [5]

Вот и я о том же. К тому же, при открытии окна и его последующем закрытии (даже мультимедиа таймером) окно на долю секунды показывается на экране, и только потом исчезает. А мне совсем не нужно его показывать, его нужно перехватить и запретить. Кстати, "диспетчер задач" - это просто пример... :)


 
DVM   (2003-02-09 01:47) [6]

Это вот длл-ка:
*****************************************************
library Hooks;

uses
Windows,
Messages,
Procs in "Procs.pas";

function CBTProc(Code: Integer; wParam, lParam: Integer): Integer; stdcall;
begin
case Code of
HCBT_ACTIVATE: ;
HCBT_CREATEWND: ;
HCBT_MINMAX: case LoWord(LParam) of
SW_MINIMIZE: PostMessage(PProgData^.WndMain, HM_ACTION, Ord(haWindowMinimize), wParam);
end;
HCBT_SYSCOMMAND: case wParam of
SC_SCREENSAVE: ;
end;
HCBT_SETFOCUS: ;
end;
Result := CallNextHookEx(PProgData^.Hooks.CBTHook, Code, wParam, lParam);
end;

function ShellProc(Code: Integer; wParam, lParam: Integer): Integer; stdcall;
begin
if Code > HC_ACTION then case Code of
HSHELL_LANGUAGE: PostMessage(PProgData^.WndMain, HM_ACTION, Ord(haLanguage), Lo(lParam));
HSHELL_WINDOWCREATED: PostMessage(PProgData^.WndMain, HM_ACTION, Ord(haShWindowCreated), wParam); {


 
DVM   (2003-02-09 01:47) [7]

Это вот модуль к длл-ке
unit Procs;

interface

uses
Windows, Messages;

type
THooks = packed record
ShellHook: HHOOK;
CBTHook: HHOOK;

end;
TProgData = packed record
WndMain: HWND;
Hooks: THooks;
end;

const
MemFile = "{CBE83BC1-3C88-4BBE-A08D-87C6C3F95EB9}.mem";

type
THookAction = (haShWindowCreated, haShWindowDestroyed, haShWindowActivated,
haShWindowRedraw, haShGetMinRect, haShActivateShellWindow, haLanguage,
haWindowMinimize);

const
HM_ACTION = WM_USER + 1;

var
PProgData: ^TProgData = nil;
hMapFileObject: THandle = 0;

function CreateAndInitOrOpenSharedFile: Boolean;
procedure CloseSharedFile;

function GetWindowClassName(Wnd: HWND): String;

implementation

function CreateAndInitOrOpenSharedFile: Boolean;
var IsInit: Boolean;
begin
Result := False;
hMapFileObject := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(TProgData), MemFile);
if hMapFileObject <> 0 then begin
IsInit := (GetLastError <> ERROR_ALREADY_EXISTS);
PProgData := MapViewOfFile(hMapFileObject, FILE_MAP_ALL_ACCESS, 0, 0, 0);
Result := (PProgData <> nil);
if Result and IsInit then FillChar(PProgData^, SizeOf(TProgData), 0);
end;
end;

procedure CloseSharedFile;
begin
UnmapViewOfFile(PProgData); // Delphi 7: Must be removed!
CloseHandle(hMapFileObject);
end;

function GetWindowClassName(Wnd: HWND): String;
var Buf: array[0..1023] of Char;
begin
if GetClassName(Wnd, Buf, 1024) > 0 then Result := String(Buf) else Result := "";
end;

end.
****************************************************
Установка хука:
if CreateAndInitOrOpenSharedFile then PProgData.WndMain := Handle;
SetHooks(True);
****************************************************
Снятие хука:
if SetHooks(False) then SendMessage(HWND_BROADCAST, WM_NULL, 0, 0);
PProgData.WndMain := 0;
CloseSharedFile;
SetHooks(False);
*****************************************************
Ловля окон:

procedure TfmMain.OnHookAction(var Msg: TMessage);
begin
case THookAction(Msg.WParam) of
haShWindowCreated:
begin
...........
end;
haShWindowDestroyed:
begin
...........
end;
haShWindowRedraw:
begin
...........
end;

end;
end;

Разбирайтесь.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.04.07;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.009 c
14-19816
gn
2003-03-18 14:35
2003.04.07
Встреча мастаков в Омске


3-19463
Mic_2000
2003-03-19 12:07
2003.04.07
Триггеры и обновление базы


7-19899
BigVova
2003-02-12 22:31
2003.04.07
Как узнать формат бумаги принтера по умолчанию?


1-19652
Фагот
2003-03-25 17:54
2003.04.07
StringList


4-19927
Style
2003-02-09 00:06
2003.04.07
Хочу HWND Desktopa!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский