Текущий архив: 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.47 MB
Время: 0.036 c