Форум: "WinAPI";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];
ВнизОпять Shell Найти похожие ветки
← →
IllusoryOrion © (2004-07-16 12:36) [0]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 13:59) [1]народ! ну помогите! ничего не могу понять - лажа полная!
← →
IllusoryOrion © (2004-07-16 15:03) [2]up
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.092 c