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

Вниз

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 вся ветка

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

Наверх





Память: 0.47 MB
Время: 0.038 c
2-1132661817
Esenin
2005-11-22 15:16
2005.12.11
Помогите загрузить jpeg в TImage из TMemoryStream.


8-1120604738
ronyn
2005-07-06 03:05
2005.12.11
Загрузка файла в проигрыватель при открытии(файла)


8-1120762481
ronyn
2005-07-07 22:54
2005.12.11
Как к тексту добавить графику?


2-1132935214
Jimm
2005-11-25 19:13
2005.12.11
Как пользоваться Utf8ToUnicode?


8-1120806167
Ботвин Дмитрий
2005-07-08 11:02
2005.12.11
Вращение Bitmap-a





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