Главная страница
    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.016 c
14-19773
an
2003-03-23 03:24
2003.04.07
Для перехода на D7 нужен FastReport для D7 , а точнее frClass


1-19523
zloy_dima
2003-03-26 14:49
2003.04.07
Память


7-19882
Незнайка 2
2003-02-12 15:20
2003.04.07
OCX


1-19676
N&N
2003-03-24 13:00
2003.04.07
Форматирование ячеек Excel


3-19426
Roki
2003-03-18 11:25
2003.04.07
Как организовать рейтинг записям БД?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский