>>243416642 А если попробовать на башорг написать? Там вроде тоже были программисты. Когда-то они многое знали и умели - говорят, они даже умели пропатчить kde2 под freebsd.
Не троллю, я пришёл сюда наудачу, вдруг мне встретится кто-то знающий. Документация майков написана дюже нечеловеколюбиво. Или я не умею её читать.
>>243418372 Бро, тут же одни дауны. Иди туда где прогеры сидят. VC какой-нить, Хабр, я думаю даже от сраных групп в ВК можно получить больше пользы, чем от двача.
>>243420605 В операционной системе Windows для получения дескриптора файла его необходимо открыть функцией CreateFile. Затем полученный дескриптор (или handle) можно использовать для работы с этим файлом. Если это драйвер, то дескриптор будет использоваться в функции DeviceIoControl.
При создании файловой системы создаются также и структуры данных, содержащие информацию о файлах. Каждый файл имеет свой индексный дескриптор, идентифицируемый по уникальному номеру (часто называемому 'i-номером' или 'айнодом'), в файловой системе, в которой располагается сам файл.
Индексные дескрипторы хранят информацию о файлах, такую как принадлежность владельцу (пользователю и группе), режим доступа (чтение, запись, запуск на выполнение) и тип файла. Существует определённое число индексных дескрипторов, которое указывает максимальное количество файлов, допускаемое определённой файловой системой. Обычно при создании файловой системы примерно 1 % её объёма выделяется под индексные дескрипторы.
Термин индексный дескриптор обычно указывает на айноды блочных устройств, управляющие постоянными файлами, каталогами и, по возможности, символьными ссылками. Подобная концепция играет важную роль при восстановлении повреждённых файловых систем.
Номер индексного дескриптора заносится в таблицу индексных дескрипторов в определённом месте устройства; по номеру индексного дескриптора ядро системы может считать содержимое айнода, включая указатели данных и прочий контекст файла. Номер индексного дескриптора файла можно посмотреть используя команду ls -i, а команда ls -l покажет информацию, хранящуюся в индексном дескрипторе. Файловые системы, не относящиеся к традиционным ФС UNIX, такие как ReiserFS, могут обходиться без таблицы индексных дескрипторов, но должны хранить аналогичную информацию схожим способом, обеспечивающим эквивалентную функциональность. Такие данные могут называться статистической информацией, по аналогии со stat — системным вызовом, поставляющим информацию программам.
Имена файлов и содержимое каталогов:
индексные дескрипторы не хранят имена файлов, только информацию об их содержимом; каталоги в Unix являются списками 'ссылочных' структур, каждая из которых содержит одно имя файла и один номер индексного дескриптора; ядро должно просматривать каталог в поисках имени файла, затем конвертировать это имя в соответствующий номер индексного дескриптора, в случае успеха; содержимое файлов располагается в блоках данных, на которые ссылаются индексные дескрипторы.
Представление ядром этих данных в памяти называется struct inode (структурным айнодом) (в ОС Linux). В BSD системах используется термин vnode, буква v в котором указывает на виртуальную файловую систему уровня ядра.
>>243421273 Множество программ, используемых системными администраторами в операционной системе (ОС) UNIX, часто использует номера индексных дескрипторов для обозначения файлов. Популярная встроенная программа проверки жестких дисков fsck или команда pfiles могут послужить в данном случае примерами, так как у них есть необходимость естественным образом конвертировать номера индексных дескрипторов в пути файлов и обратно. Это может быть дополнено использованием программы поиска файлов find с ключом -inum или командой ls с соответствующим ключом (которым на большинстве платформ является -i).
>>243421091 Какую, блядь, метаинформацию, и у каких, блядь, файлов ты собрался читать? Мне нужно вызвать функцию, которая должна вернуть мне значения Х и Y конкретного отдельно взятого ярлыка на рабочем столе. В каком файле ты собрался это искать?
>>243421992 Ярлыку не нужно искать файл. Ярлык, запускающий мою программу, должен ссылаться сам на себя. На свои собственные координаты. Ему не нужно себя искать где-то на компе.
Теоретически, можно привязать координаты происходящей после запуска магии к координатам курсора мыши. Но это костыли, и довольно убогие, и я так не хочу, мне так не нравиться.
>>243421992 Представь себе программу, которая делает нечто визуальное именно в месте (в координатах на экране), где находится ярлык этой программы. После клика на этот ярлык.
>>243415661 (OP) Да никак, скорее всего. Отображением и сортировкой ярлаков занимается собственная программа винды (вроде shell32.dll) и открытого апи к ней нет. Нужно будет ее ломать, что бы выудить значения переменных. iconmenricsa, это просто структура, которая содержит параметры настройки ярлыков - отступы, шрифт подписи и т.п. и изменения в ней действую на всю сетку ярлыков. Может быть возможно с помощью какого-нить cheat engine найти в памяти адрес координат конкретного ярлыка и потом сделать указатель на этот адрес. Но тогда это будет работать только на твоем компе.
Вот, почитай, как ломали explorer.exe, что бы понять, почему он 20 сек ярлыки сортирует. Просто для понимания того, в какую залупу надо залезть, что бы получить координаты ярлыков. Это нифига не открытый апи. https://habr.com/ru/company/vdsina/blog/544218/
function GetFirstChild(hwndValue: HWND): HWND; begin Result := GetWindow(hwndValue, GW_CHILD); end;
function Translate(Value: String): String; begin SetLength(Result, Length(Value)); AnsiToOem(@Value[1], @Result[1]); end;
begin // Ищем SysListView32 рабочего стола hwndRemoteSysListView := GetFirstChild(GetFirstChild(FindWindow("ProgMan", nil))); if hwndRemoteSysListView = 0 then ExitProcess(GetLastError);
// Получаем количество элементов (ярлыков на рабочем столе) nItemCount := ListView_GetItemCount(hwndRemoteSysListView);
// Получаем ID процесса, которому принадлежит найденное окно GetWindowThreadProcessId(hwndRemoteSysListView, &dwProcessID); if dwProcessID = 0 then ExitProcess(GetLastError);
// Открываем процесс hProcess := OpenProcess(PROCESS_ALL_ACCESS, TRUE, dwProcessID); if hProcess = 0 then ExitProcess(GetLastError);
// Выделяем в нем память под текстовый буффер pszText := VirtualAllocEx(hProcess, nil, cchTextMax, MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE); if GetLastError <> 0 then ExitProcess(GetLastError);
// Выделяем в нем память под структуру LVITEM plviRemoteLVItem := VirtualAllocEx(hProcess, nil, SizeOf(LV_ITEM), MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE); if GetLastError <> 0 then ExitProcess(GetLastError);
// Пишем ее в память удаленного процесса if not WriteProcessMemory(hProcess, plviRemoteLVItem, @lviRemoteLVItem, SizeOf(LV_ITEM), dwBytesWriten) then ExitProcess(GetLastError);
// Выделяем в нем память под структуру TRect pRemoteRect := VirtualAllocEx(hProcess, nil, SizeOf(TRect), MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE); if GetLastError <> 0 then ExitProcess(GetLastError);
// Получаем текст со всех элементов for I := 0 to nItemCount - 1 do begin // Отправляем сообщение с указателем на выделенный буффер под LVITEM nTextLength := SendMessage(hwndRemoteSysListView, LVM_GETITEMTEXT, I, Integer(plviRemoteLVItem));
// Читаем результат ZeroMemory(@svText, cchTextMax); ReadProcessMemory(hProcess, lviRemoteLVItem.pszText, @svText[1], nTextLength, dwBytesWriten);
// Чтобы получить координаты каждого элемента нужно подготовить структуру ZeroMemory(@ARect, SizeOf(TRect)); ARect.Left := LVIR_ICON; if not WriteProcessMemory(hProcess, pRemoteRect, @ARect, SizeOf(TRect), dwBytesWriten) then ExitProcess(GetLastError);
// Посылаем сообщение для получения координат каждого элемента SendMessage(hwndRemoteSysListView, LVM_GETITEMRECT, I, Integer(pRemoteRect));
// Читаем результат ReadProcessMemory(hProcess, pRemoteRect, @ARect, SizeOf(TRect), dwBytesWriten);
Writeln(Translate(PChar(@svText[1]))); Writeln(Translate( Format("- координаты: Left = %d, Top = %d, Right = %d, Bottom = %d", [ARect.Left, ARect.Top, ARect.Right, ARect.Bottom])));
end;
// Освобождаем ранее выделенную память VirtualFreeEx(hProcess, pszText, 0, MEM_RELEASE); VirtualFreeEx(hProcess, plviRemoteLVItem, 0, MEM_RELEASE);
// Закрываем описатель процесса CloseHandle(hProcess);
I will write a sample for you to demonstrate how to get the desktop icon locations. First, actually the desktop is a large ListView, if you use SPY++ to see the handle of the desktop, you will find that there is a window with the title Program Manager, under which is another window of SHELLDLL_DefView type without title, below it is a window of SysListView32 type with caption of FolderView. So, we can use the FindWindow and FindWindowEx API to get the ListView which host the desktop icons, and use SendMessage API to send LVM_GETITEMPOSITION message to get the icon positions, however, since each process has its own memory, we can't steal program's memory directly from one process to another, we need some trick, we can allocate memory in the address space of the desktop ListView and read from that, this can be done by VirtualAllocEx() API. Now, the problem is to get the process handle of the ListView, we can use GetWindowThreadProcessId API to get the PID of the desktop window process, and use OpenProcess() to get a handle to the process.
>>243425638 Ну так хули, здесь идет граб данных окна. Подключение к окну "эксплорер" и пиздинг его данных. Это, походу, какая-то старая запись, не факт что сейчас сработает. Когда-то в винде была такая архитектура, что любой процесс, это окно, со своим ID. Я не работаю с винапи, но мне кажется, что это уже давно не так. Ну, а если и так, то я помню, что когда-то (лет 12 назад) делал тоже самое с помощью стандартных инструментов визуал студии. У нее есть в меню какие-то утилиты для обнаружения окон, их ID и т.п. Ну были, по крайней мере 12 лет назад. Я с тех пор на с++ и не писал ничего, не знаю, что там сейчас и как.
Как по мне, так проще свой рабстол написать и можешь пиздячить в него что душе угодно. Поставишь в автозапуск и все.
>>243426653 Ладно. Кароч. Я тебе расскажу саму суть своей идеи.
Вот смотри. Есть у винды семёрки значки в быстром запуске. Я хочу, чтобы при клике на один из этих значков разворачивалась ещё одна панель быстрого запуска, вертикальная.
Чтобы оптимизировать быстрый запуск.
Существующие сейчас решения мне не нравятся. Одно уёбищней другого.
Вот и вижу я только одну возможность - написать такое самому.
При этом я не хочу переписывать весь рабочий стол - всё прочее меня вполне устраивает.
>>243429562 Грешновато это всё - дрочить и тогдалие.
ОП недавно ради практики написал на джаве граббер, выкачивающий весь визуальный контент выбранного фап-треда.Да, я знаю, что уже существуют решения с похожим функционалом. Задача была именно написать такое своими руками.
>>243415661 (OP) давно не смотрел, забыл уже эту ботву. в какой-то винде это был просто listview и иконки шевелились через его апи. а дальше хз - там оно вроде через com дергалось, не было прямых простых функций. ну или отреверси explorer.exe и посмотри че там и как внутри.
>>243434496 Чё сказать-то хотел? Тебе, убогонькому, невдомёк, что люди увлекающиеся программированием иногда допиливают утилиты под свои нужды? В стандартной панели быстрого запуска виндоуз7 отсутствует возможность создавать папки ярлыков (как например в анройде). Отсутствует такая возможность искаропки. Вот я и решил её запилить.