![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Опять Shell [D5, Win95/98, Win2k, WinXP]
IllusoryOrion © (2004-07-16 12:36:00)library WndMng;
uses
Windows, Messages, SysUtils;
{$R *.RES}
type
PHookData = ^THookData;
THookData = record
HookId: THandle;
end;
var
HookData: PHookData;
HookDataHandle: THandle;
function EnableProcessPrivilege(const Enable: Boolean; const Privilege: string): Boolean;
const
PrivAttrs: array [Boolean] of DWORD = (0, SE_PRIVILEGE_ENABLED);
var
Token: THandle;
TokenPriv: TTokenPrivileges;
ResLen: DWord;
begin
Result:=False;
if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, Token) then
begin
TokenPriv.PrivilegeCount:=1;
LookupPrivilegeValue(nil, PChar(Privilege), TokenPriv.Privileges[0].Luid);
TokenPriv.Privileges[0].Attributes := PrivAttrs[Enable];
AdjustTokenPrivileges(Token, False, TokenPriv, SizeOf(TokenPriv), nil, ResLen);
Result:=GetLastError = ERROR_SUCCESS;
CloseHandle(Token);
end;
end;
function ShellHookProc(nCode, WParam, LParam: integer): integer; stdcall;
var
ShellWindow: THandle;
begin
ShellWindow:=FindWindow(nil, 'Program Manager');
SendMessage(ShellWindow, RegisterWindowMessage('ORIONSHELLHOOK'), nCode, WParam);
Result:=CallNextHookEx(HookData^.HookId, nCode, WParam, LParam);
end;
procedure RegisterShellHook(Active: Boolean); stdcall;
begin
if Active then HookData^.HookId:=SetWindowsHookEx(WH_SHELL, @ShellHookProc, hInstance, 0) else UnhookWindowsHookEx(HookData^.HookId);
end;
procedure InitializeHooks;
const
HookFilename: PChar = 'OSWNDS_HOOK_DATA';
begin
if Win32Platform<>VER_PLATFORM_WIN32_WINDOWS then EnableProcessPrivilege(True, 'SeDebugPrivilege');
HookDataHandle:=CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(THookData), HookFilename);
HookData:=MapViewOfFile(HookDataHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(THookData));
end;
procedure DeinitializeHooks;
begin
UnmapViewOfFile(HookData);
CloseHandle(HookDataHandle);
end;
procedure DLLEntryPoint(Reason: DWord); stdcall;
begin
case Reason of
DLL_PROCESS_ATTACH:
begin
InitializeHooks;
end;
DLL_PROCESS_DETACH:
begin
DeinitializeHooks;
end;
end;
end;
exports
RegisterShellHook,
ShellHookProc;
begin
DLLProc:=@DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
Это код ДЛЛ для отлова сообщений посылаемых шеллу. Все прекрасно работает, НО! Например в TotalCommander'e если выбрать файл и нажать View(Просмотр) он (ТС) виснет намертво (и окно не отображается), хотя под Explorerom все OK. В чем проблема?
IllusoryOrion (2004-07-16 15:03:00) [1]up
IllusoryOrion (2004-07-16 13:59:00) [2]народ! ну помогите! ничего не могу понять - лажа полная!