Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.01.2013, 18:22   #1
IvanNovator
 
Регистрация: 09.12.2012
Сообщений: 3
По умолчанию ListView рабочего стола (x32 и x64 системы)

Приветствую, форумчане.
Мне необходимо получить информацию об иконках рабочего стола. Поискал в инете информацию.
В итоге написал небольшой код. Он получает текст иконки с рабочего стола, только одной иконки, не стал сюда писать цикл.
В начале не работало, все время nRes получался равным 0. Так вот, система у меня 64 битная, а приложение было 32 битное изначально. Сработало, когда скомпилировал как 64 битное. И возникло у меня два вопроса:
1. Как вывести текст иконки в консоль (по идее текст иконки в unicode и как его дальше выводить)?
2. Как из 32 битного приложения получить иконки в 64 битной системе. Или мне нужно будет скомпилировать две проги?

Код:
#include "stdafx.h"
#include <conio.h>
#include <Windows.h>
#include <CommCtrl.h>

HWND hListView;
BOOL CALLBACK enumWin(HWND hWnd, LPARAM lParam) {
	HWND hShellDLL;
	wchar_t cnShellDLL[] = L"SHELLDLL_DefView";
	wchar_t cnListView[] = L"SysListView32";
	
	hShellDLL = FindWindowEx(hWnd, NULL, cnShellDLL, NULL);
    if(hShellDLL) {
        hListView = FindWindowEx(hShellDLL, NULL, cnListView, NULL);
		if (hListView) {
			return false;
		}
    }
    return true;
}

int _tmain(int argc, _TCHAR* argv[]) {
	// Поиск ListView рабочего стола. Указатель в hListView.
	EnumWindows(enumWin, 0);
	
	// Получение кол-ва иконок рабочего стола.
	int count = SendMessage(hListView, LVM_GETITEMCOUNT, 0, 0);
	printf("Count items: %d\n", count);

	// Открытие процесса и выделение памяти.
	DWORD processId;
    GetWindowThreadProcessId(hListView, &processId);

	HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, false, processId);
	LVITEM *pLvItem = (LVITEM*) VirtualAllocEx(hProcess, NULL, sizeof(LVITEM), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
	LPTSTR pText = (LPTSTR) VirtualAllocEx(hProcess, NULL, sizeof(wchar_t)*256, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);

	wchar_t Text[256] = {0};

    LVITEM LvItem = {0};
    LvItem.mask = LVIF_TEXT;
    LvItem.iSubItem = 0;
    LvItem.pszText = pText;
    LvItem.cchTextMax = 256; 
    // Номер иконки.
	LvItem.iItem = 0; 

    WriteProcessMemory(hProcess, pLvItem, &LvItem, sizeof(LVITEM), NULL);

    int nRes = (int) SendMessage(hListView, LVM_GETITEMTEXT, 0, (LPARAM) pLvItem);
	if (nRes > 0) {
		ReadProcessMemory(hProcess, pText, &Text[0], sizeof(TCHAR)*256, NULL);
		// Перевод в oem-кодировку.
		//CharToOemBuff(Text, (LPSTR) Text, 256);
		wprintf(L"%d - %s", nRes, Text);
	}

	VirtualFreeEx(hProcess, pLvItem, 0, MEM_RELEASE);
	VirtualFreeEx(hProcess, pText, 0, MEM_RELEASE);
	CloseHandle(hProcess);

	_getch();
	return 0;
}
IvanNovator вне форума Ответить с цитированием
Старый 22.01.2013, 10:15   #2
IvanNovator
 
Регистрация: 09.12.2012
Сообщений: 3
По умолчанию

Вопрос про вывод в консоль unicode отпадает. Завел отдельную переменную, в нее с помощью функции CharToOemBuff конвертирую текст, затем вывожу.
По второму вопросу. Что-то мне кажется, что причина в структуре LVITEM, для 64 битных приложений она имеет другой размер (пока не проверял). Попробую сделать так: приложение соберу как 32-битное, но в самом приложении буду определять какая ОС (32 или 64), если 64, то подсуну 64 битную структуру.
IvanNovator вне форума Ответить с цитированием
Старый 22.01.2013, 12:33   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Мне вот что интересно - как будет работать WriteProcessMemory() из 32 битного в 64? Тоже самое относиться к LVITEM - размеры разные изза размера указателей. А эти указатели еще надобудет заполнить... Может проще загрузить в нужный процесс свою DLL (их будет две, для 32 и 64).

И еще, может просто сканировать папку рабочего стола и/или соотвествующие разширения в реестре...
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
блокировка рабочего стола Darcangel Общие вопросы Delphi 5 26.12.2012 15:10
Хендл рабочего стола Михаил Юрьевич Общие вопросы Delphi 2 14.10.2012 23:26
Скриншот рабочего стола C# alxd Общие вопросы .NET 5 08.02.2010 19:38
Менеджер рабочего стола Kreadlling Общие вопросы C/C++ 0 08.10.2009 19:35
скриншоты рабочего стола Alar Общие вопросы Delphi 0 29.10.2006 10:59