Главная страница
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.026 c
2-1132763349
floxi
2005-11-23 19:29
2005.12.11
RichEdit-ы


14-1132144432
dr Tr0jan
2005-11-16 15:33
2005.12.11
Глюк в Multisim (EWB)


2-1133011576
The One
2005-11-26 16:26
2005.12.11
Получение предыдущего значения параметра спомошью RegQueryValueEx


1-1132078212
AntonXXX
2005-11-15 21:10
2005.12.11
Запуск процедуры из DLL при клике


14-1132587549
Yura32
2005-11-21 18:39
2005.12.11
Zvuk