Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кординаты ярлыков на рабочем столе 
V
    Опции темы
Riddik
Дата 11.10.2009, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 2.12.2006

Репутация: нет
Всего: нет



Приветствую.

Нужно узнать координаты ярлыков.
Сначала получаю дескриптор рабочего стола, затем дочерних элементов:
Выделить всёкод C++
1:
2:
3:
HWND desc = FindWindow("ProgMan", NULL);
 desc = GetWindow(desc, GW_CHILD);
 desc = GetWindow(desc, GW_CHILD);


Узнаю количество ярлыков:

Выделить всёкод C++
1:
int n = SendMessage(desc, LVM_GETITEMCOUNT, 00);


И надо записать их координаты:

Выделить всёкод C++
1:
2:
3:
4:
5:
6:
POINT p;
for(int i=0; i<n; i++) 
{
       SendMessage(desc, LVM_GETITEMPOSITION, i , (LPARAM)&p);
       file<<p.x<<" "<<p.y<<'\n';
}


Все числа в файле одинаковые, нифига не записываются в p координаты значков.

Что не так делаю?


И второй вопрос: как происходит нумерация значков - просте слева направо и сверху вниз? Или если перемешать значки (переместить), то нумерация за ними сохраниться?


PM MAIL   Вверх
uxoos
  Дата 11.10.2009, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 11.8.2009

Репутация: нет
Всего: нет



Ты наверно тоже это тестовое задание выполняешь...
Я остановился на том что при вызове в программе GetItemPosition(hWndw,1,(LPARAM)&pt) проводник windows7 перезапускается. Дескриптор рабочего стола находится верно.
Выделить всёкод C++
1:
2:
3:
4:
HWND hWndw=GetWindow(GetWindow(FindWindow("ProgMan",NULL),GW_CHILD),GW_CHILD);
POINT pt;
 ListView_GetItemPosition(hWndw,1,(LPARAM)&pt);
 //или эта функция SendMessage(hWndw,LVM_GETITEMPOSITION,1,pt);

Не знаю в чём дело:(
1 - хочется узнать что за окно такое "ProgMan" которому судя по функциям рабочий стол является внуком.
2 - почему проводник windows7 перезапускается?
3 - как правильно получить координаты иконы с рабочего стола.
4 - где можно почитать про подобные вещи.
кстати
Выделить всёкод C++
1:
int nIconCount=SendMessage(hWndw,LVM_GETITEMCOUNT,0,0);

выполняется правильно.
PM MAIL   Вверх
smoke_man
Дата 12.10.2009, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 25.1.2007
Где: Рязань

Репутация: 5
Всего: 17



Вот исходник с пояснениями для сохранения позиций ярлыков. 

Присоединённый файл ( Кол-во скачиваний: 44 )
Присоединённый файл  IconOutlinerSrc.zip 51,08 Kb


--------------------
0x2b|~0x2b
PM MAIL ICQ GTalk   Вверх
Riddik
Дата 12.10.2009, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 2.12.2006

Репутация: нет
Всего: нет



uxoos, какое тест-задание smile

smoke_man, благодарю! 
Там лезут в реестр и используют MFC.

Неужто без реестра не обойтись.
И все же, ведь должно ведь работать, из MSDN'а так вроде...
SendMessage(desc, LVM_GETITEMPOSITION, i , (LPARAM)&p);

Почему не присваивает координаты значка?


Это сообщение отредактировал(а) Riddik - 12.10.2009, 01:36
PM MAIL   Вверх
smoke_man
Дата 12.10.2009, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 25.1.2007
Где: Рязань

Репутация: 5
Всего: 17



Реестр они используют для сохранения расположения ярлыков. С использованием выше приведнного исходника накидал пример, который  выводит координаты ярлыков.

Присоединённый файл ( Кол-во скачиваний: 38 )
Присоединённый файл  Icons.rar 6,54 Kb


--------------------
0x2b|~0x2b
PM MAIL ICQ GTalk   Вверх
Riddik
Дата 12.10.2009, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 2.12.2006

Репутация: нет
Всего: нет



smoke_man, большое спасибо!

PM MAIL   Вверх
uxoos
Дата 12.10.2009, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 11.8.2009

Репутация: нет
Всего: нет



Да. Наверно это правильно.. Вот содержательная часть исходника. Чтобы гугл нашёл и если файл удалят. Я просто так иногда ищу подобные решения и если, нахожу их в ссылках на удалённый файл исходника. А, ладно, не читайте это если не понравилось что прочитали. smile 
Выделить всёРазвернуть кодкод C++
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
#include <Windows.h>
#include <commctrl.h>
#include <iostream>
HWND FindListView() throw(...)
{
    HWND progman_wnd = 0;
    HWND desktopview_wnd = NULL;
    HWND listview_wnd = NULL;
    // First find the main window of program that houses the desktop.
    progman_wnd = FindWindowA(NULL, "Program Manager");
    if(progman_wnd == NULL) throw(GetLastError());
    // Then get the desktop window
    desktopview_wnd = FindWindowExA(progman_wnd, NULL, "SHELLDLL_DefView", NULL);
    if(desktopview_wnd == NULL) throw(GetLastError());
    // Finally get the handle to the listview on the desktop.
    // Thanks ef_ef_ef@yahoo.com for pointing out this works in NT 4 and not the way I did it originally.
    listview_wnd = FindWindowExA(desktopview_wnd, NULL,"SysListView32", NULL);
    if(listview_wnd == NULL) throw(GetLastError());
    return listview_wnd;
}
HANDLE FindExlorerProcess(HWND slave_wnd) throw(...)
    // Thanks to mr_williams@rave.ch who pointed me to GetWindowThreadProcessId(), that makes this function waaaaaaaaaaaaay shorter.
    HANDLE proc;
    DWORD explorer_pid;
    // Get the PID based on a HWND. This is the good stuff. You wouldn't believe the long and difficult function I had to write before I heard of this simple API call.
    GetWindowThreadProcessId(slave_wnd, &explorer_pid);
    // Get a process handle which we need for the shared memory functions.
    proc = OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, explorer_pid);
    if(proc == NULL) throw(GetLastError());
    else return proc;
}
void* AllocMemInForeignProcess(HANDLE process, unsigned long size) throw(...)
{
    void *ptr = VirtualAllocEx(process, NULL, size, MEM_COMMIT, PAGE_READWRITE);
    if(ptr == NULL) throw(GetLastError());
    else return ptr;
}
void ReadFromForeignProcessMemory(HANDLE process, void* ptr, void* target, unsigned long size) throw(...)
{
    if(ReadProcessMemory(process, ptr, target, size, NULL) == 0throw(GetLastError());
}
void FreeMemInForeignProcess(HANDLE process, void* ptr) throw(...)
{
    if(VirtualFreeEx(process, ptr, 0, MEM_RELEASE) == 0throw(GetLastError());
}
int main()
{
    void* ipc_iconpos = 0;
    LRESULT msg_result = 0;
    HANDLE explorer = 0;
    POINT iconpos;
    HWND listview_wnd = FindListView();
    unsigned long iconcount = static_cast<unsigned long>(SendMessage(listview_wnd, LVM_GETITEMCOUNT, 00));
    // Get the PID of the process that houses the listview, i.e.: Explorer.exe
    explorer = FindExlorerProcess(listview_wnd);
    // Here we allocate the shared memory buffers to use in our little IPC.
    ipc_iconpos = AllocMemInForeignProcess(explorer, sizeof(POINT));
    for(int i = 0; i < iconcount ; ++i)
    {
        msg_result = SendMessage(listview_wnd, LVM_GETITEMPOSITION, i, reinterpret_cast<LPARAM>(ipc_iconpos));
        ReadFromForeignProcessMemory(explorer, ipc_iconpos, &iconpos, sizeof(POINT));
        std::cout<<"x = "<<iconpos.x<<" y = "<<iconpos.y<<std::endl;
    }
    FreeMemInForeignProcess(explorer, ipc_iconpos);
    CloseHandle(explorer);
    system("PAUSE");
    return EXIT_SUCCESS;
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.2729 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.