![](/img/icon_plus.gif)
#pas
unit HiAsmUnit;
interface
uses Windows, Messages, Kol, Share, Debug;
type
THiAsmClass = class(TDebug)
private
public
H:THI_Event;
onGetLastActivePopup:THI_Event;
procedure doGetLastActivePopup(var _Data:TData; Index:word);
end;
implementation
type
LV_ITEM = record
mask: UINT;
iItem: Integer;
iSubItem: Integer;
state: UINT;
stateMask: UINT;
pszText: PWideChar;
cchTextMax: Integer;
iImage: Integer;
lParam: LPARAM;
iIndent: Integer;
iGroupId: Integer;
cColumns: Integer;{ tile view columns }
puColumns: PUINT;
//piColFmt: PInteger;
//iGroup: Integer;{ readonly. only valid for owner data. }
end;
procedure THiAsmUnit.doGetLastActivePopup;
const
cchTextMax=255;
var
Win: THandle;
vItem, nTextLength: Integer;
LVItem: LV_ITEM;
pLVItem: ^LV_ITEM;
pszText: PChar;
svText: ShortString;
vProcessId: UInt;
vProcess: Integer;
vPointer: ^Integer;
dwWriten: DWORD;
begin
// Поиск рабочего стола
//Win := FindWindow('Progman', 'Program Manager');
//Win := FindWindowEx(Win, 0, 'SHELLDLL_DefView', 0);
//Win := FindWindowEx(Win, 0, 'SysListView32', 'FolderView');
Win := ReadInteger(_Data,H,0);
// Получаем процесс рабочего стола
GetWindowThreadProcessId(Win, @vProcessId);
vProcess := OpenProcess(PROCESS_ALL_ACCESS, false, vProcessId);
//vItemCount := SendMessage(Win, LVM_GETITEMCOUNT, 0, 0);
// Выделяем в нем память под текстовый буффер
pszText := VirtualAllocEx(vProcess, nil, cchTextMax, MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
// Выделяем в нем память под структуру LVITEM
pLVItem := VirtualAllocEx(vProcess, nil, SizeOf(LV_ITEM), MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
// Заполняем структуру
ZeroMemory(@LVItem, SizeOf(LV_ITEM));
LVItem.mask := LVIF_TEXT;
LVItem.pszText := @pszText;
LVItem.cchTextMax := cchTextMax;
LVItem.iSubItem := 0;
vItem := SendMessage(Win, LVM_GETHOTITEM, 0, 0);
// Пишем ее в память удаленного процесса
if not WriteProcessMemory(vProcess, pLVItem, @LVItem, SizeOf(LV_ITEM), dwWriten) then Exit;
nTextLength := SendMessage(Win, LVM_GETITEMTEXT, vItem, Integer(pLVItem));
// Читаем результат
ZeroMemory(@svText, cchTextMax);
ReadProcessMemory(vProcess, LVItem.pszText, @svText[1], nTextLength, dwWriten);
_hi_OnEvent(onGetLastActivePopup, PChar(@svText[1]));
VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
CloseHandle(vProcess);
end;
end.