Разработан по мотивам Статьи
Add(MainForm,2953706,245,70)
{
Width=462
Height=34
}
Add(InlineCode,13953824,196,70)
{
WorkPoints=#20:doGetLastActivePopup|
EventPoints=#20:onGetLastActivePopup|
DataPoints=#1:H|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|42:uses Windows, Messages, Kol, Share, Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|5: |9: public|17: H:THI_Event;|36: onGetLastActivePopup:THI_Event;|70: procedure doGetLastActivePopup(var _Data:TData; Index:word); |5: end;|0:|14:implementation|0:|4:type|18: LV_ITEM = record|15: mask: UINT;|19: iItem: Integer;|22: iSubItem: Integer;|16: state: UINT;|20: stateMask: UINT;|23: pszText: PWideChar;|24: cchTextMax: Integer;|20: iImage: Integer;|19: lParam: LPARAM;|21: iIndent: Integer;|60: |22: iGroupId: Integer;|43: cColumns: Integer;{ tile view columns }|21: puColumns: PUINT;|140: |25: //piColFmt: PInteger;|62: //iGroup: Integer;{ readonly. only valid for owner data. }|6: end;|0:|42:procedure THiAsmUnit.doGetLastActivePopup;|5:const|19: cchTextMax=255;|3:var|17: Win: THandle;|32: vItem, nTextLength: Integer;|20: LVItem: LV_ITEM;|22: pLVItem: ^LV_ITEM;|19: pszText: PChar;|24: svText: ShortString;|2: |21: vProcessId: UInt;|22: vProcess: Integer;|23: vPointer: ^Integer;|20: dwWriten: DWORD;|5:begin|27: // Поиск рабочего стола|52: Win := FindWindow('Progman', 'Program Manager');|55: Win := FindWindowEx(Win, 0, 'SHELLDLL_DefView', 0);|63: Win := FindWindowEx(Win, 0, 'SysListView32', 'FolderView');|38: // Получаем процесс рабочего стола|47: GetWindowThreadProcessId(Win, @vProcessId);|67: vProcess := OpenProcess(PROCESS_ALL_ACCESS, false, vProcessId);|4: |61: //vItemCount := SendMessage(Win, LVM_GETITEMCOUNT, 0, 0);|4: |49: // Выделяем в нем память под текстовый буффер|101: pszText := VirtualAllocEx(vProcess, nil, cchTextMax, MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);|49: // Выделяем в нем память под структуру LVITEM|106: pLVItem := VirtualAllocEx(vProcess, nil, SizeOf(LV_ITEM), MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);|26: // Заполняем структуру|41: ZeroMemory(@LVItem, SizeOf(LV_ITEM));|29: LVItem.mask := LVIF_TEXT;|31: LVItem.pszText := @pszText;|36: LVItem.cchTextMax := cchTextMax;|25: LVItem.iSubItem := 0;|4: |52: vItem := SendMessage(Win, LVM_GETHOTITEM, 0, 0);|4: |44: // Пишем ее в память удаленного процесса|95: if not WriteProcessMemory(vProcess, pLVItem, @LVItem, SizeOf(LV_ITEM), dwWriten) then Exit;|78: nTextLength := SendMessage(Win, LVM_GETITEMTEXT, vItem, Integer(pLVItem));|4: |23: // Читаем результат|36: ZeroMemory(@svText, cchTextMax);|83: ReadProcessMemory(vProcess, LVItem.pszText, @svText[1], nTextLength, dwWriten);|5: |4: |4: |68: //vItemCount := SendMessage(Win, LVM_GETITEMTEXT, vItem, tItem);|55: //ListView_GetItemText(Win, vItem, 0, Text, 256);|4: |57: _hi_OnEvent(onGetLastActivePopup, PChar(@svText[1]));|4: |54: VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);|26: CloseHandle(vProcess);|9:end; |0:|4:end.|
link(onGetLastActivePopup,2953706:doCaption,[])
}
Add(Timer,9968603,147,70)
{
Interval=500
link(onTimer,13953824:doGetLastActivePopup,[])
}
Также, непонятно где хранится сама ссылка
------------ Дoбавленo в 14.16:
Да забыл сказать что иконки берутся с рабочего стола