Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.11;
Скачать: CL | DM;

Вниз

CBT_Hook !   Найти похожие ветки 

 
psa247 ©   (2005-10-10 10:59) [0]

В продолжение разговора о положении окна поверх всех...
Написал ДЛЛ-ну, только вот, вообще отказывается работать. Подскажите ошибку.

library top;

uses SysUtils, Windows, Messages;

const MMFName : PChar = "Data_MMF"; // имя объекта файлового отображения

type
 // структура, поля которой будут отображены в файл подкачки
 PGlobalDLLData = ^TGlobalDLLData;
 TGlobalDLLData = packed record
   SysHook : HHook;                // дескриптор установленной ловушки
    OurWnd : HWND;                 // дескриптор окна STEALTH
 end;

var MMFHandle : THandle;
  GlobalData : PGlobalDLLData;

// Эта функция будет вызываться всякий раз, когда в системе появится интересующее нас
// событие, т.е. активация и передача фокуса какому-либо окну
function CBTProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
var CurrWnd : HWND;
   EventMsg : cardinal;
   SysHook : HHook;
begin
  CurrWnd:= TMsg(Pointer(lParam)^).hwnd;     // Получаем hwnd окна, в котором произошло событие
  Result:= 0;
  SysHook:= 0;

  if(code = Windows.HC_ACTION)and(CurrWnd > 0)then begin
    SysHook:= GlobalData^.SysHook;             // Прочитаем SysHook из разделяемой памяти
    EventMsg:= TMsg(Pointer(lParam)^).message; // Выделяем интересующее нас событие
    try
      //SendMessage(GlobalData^.OurWnd, WM_SETFOCUS, 0, 0);
      //SendMessage(GlobalData^.OurWnd, WM_ACTIVATE, 0, 0);
      if EventMsg = HCBT_ACTIVATE then begin
        // Возвращаем "1" - запрещаем активацию чужого окна
        // Возвращаем "0" - позволяем активизироваться нашему окну
        if CurrWnd <> GlobalData^.OurWnd then Result:= 1;
        end;
      if EventMsg = HCBT_SETFOCUS then begin
        // Возвращаем "0" - разрешаем потерю фокуса ввода в чужом окне
        // Возвращаем "1" - запрещаем потерю фокуса ввода нашему окну
        if CurrWnd = GlobalData^.OurWnd then Result:= 1;
        end;
   except
      end;
    end;
  CallNextHookEx(SysHook, code, wParam, lParam); // Передаем далее по цепочке
end;

procedure Hook(switch : Boolean; OurWHandle : HWND)export; stdcall;
begin
  if switch then begin
   GlobalData^.SysHook:= SetWindowsHookEx(WH_CBT, @CBTProc, HInstance, 0);
   GlobalData^.OurWnd:= OurWHandle;    // Хэндл нашего главного окна
   //if GlobalData^.SysHook = 0 then MessageBox(0,"","",0);
   end
else UnhookWindowsHookEx(GlobalData^.SysHook);
end;

procedure OpenGlobalData;
begin
  // Подключим MMF
  MMFHandle:= CreateFileMapping(INVALID_HANDLE_VALUE,nil,PAGE_READWRITE,0,SizeOf(TGlobalDLLData),MMFName);
  if MMFHandle = 0 then exit;
  GlobalData:= MapViewOfFile(MMFHandle,FILE_MAP_ALL_ACCESS,0,0,SizeOf(TGlobalDLLData));
  //if GlobalData = nil then MessageBox(0,"","",0);
end;

procedure CloseGlobalData;
begin
  UnmapViewOfFile(GlobalData);
  CloseHandle(MMFHandle);
end;

procedure DLLEntryPoint(dwReason: Integer);
begin
  case dwReason of
    DLL_PROCESS_ATTACH : OpenGlobalData;
    DLL_PROCESS_DETACH : CloseGlobalData;
    end;
end;

exports hook index 0 name "Hook" resident;

begin
  // назначим поцедуру переменной DLLProc
  DLLProc:= @DLLEntryPoint;
  // вызываем назначенную процедуру для отражения факта присоединения данной библиотеки к процессу
  DLLEntryPoint(DLL_PROCESS_ATTACH);
end.


 
Lamer@fools.ua ©   (2005-10-10 14:32) [1]

>>psa247 ©   (10.10.05 10:59)

1.

>function CBTProc(code : integer; wParam : word; lParam : longint)

function CBTProc(code : integer; wParam : longint; lParam : longint)

2.
>SysHook:= GlobalData^.SysHook;             // Прочитаем SysHook из разделяемой памяти

Поставить перед IF"ом.

3.
За оформление кода двойка.


 
psa247 ©   (2005-10-10 15:02) [2]

Спасибо.
Сама CBTproc не вызывается


 
psa247 ©   (2005-10-11 14:02) [3]

Все, разобрался. Кому интересно - могу выложить код


 
Antonn ©   (2005-10-11 14:27) [4]

psa247 ©   (11.10.05 14:02) [3]
а если в приложении 2 окна должны вылазить на первый план - работает?
с message WM_WINDOWPOSCHANGING; для каждого онка - и приложение зависает:(


 
psa247 ©   (2005-10-11 16:56) [5]


// Эта функция будет вызываться всякий раз, когда в системе появится интересующее нас
// событие, т.е. активация и передача фокуса какому-либо окну
function CBTProc(code : integer; wParam : longint; lParam : longint): longint; stdcall;
var OurWnd : HWND;
   SysHook : HHook;
begin
  SysHook:= GlobalData^.SysHook;        // Прочитаем SysHook из разделяемой памяти
  OurWnd:= GlobalData^.OurWnd;          // Хэндл нашего окна
  if code < 0 then begin
    Result:= CallNextHookEx(SysHook,code,wParam,lParam); // Передаем далее по цепочке
    exit;
    end;
  Result:= 0;
  // Возвращаем "0" - позволяем провести событие
  // Возвращаем "1" - запрещаем событие
  if(code=HCBT_ACTIVATE)and(OurWnd<>wParam)then begin
    if(GetParent(wParam)=OurWnd)then begin
      BringWindowToTop(wParam);
      SetForegroundWindow(wParam);
      exit;
      end;
    BringWindowToTop(OurWND);
    SetForegroundWindow(OurWnd);
    Result:= 1;
    end;
end;

// Доработаешь как тебе надо



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

Текущий архив: 2005.12.11;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.031 c
10-1108936293
GanibalLector
2005-02-21 00:51
2005.12.11
Объектная модель MOffice


8-1120913917
KyRo
2005-07-09 16:58
2005.12.11
Длинна песни и звук


1-1131685235
Andrey V.
2005-11-11 08:00
2005.12.11
Internal error: L1496


1-1131573898
Serafim
2005-11-10 01:04
2005.12.11
Вызов процедуры из строки


14-1132585622
oldman
2005-11-21 18:07
2005.12.11
Как испортить людям выходной... :(