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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.07.2010, 00:44   #1
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию перемещение ярлыков

как можно программно переместить ярлыки на рабочем столе? всмысле поменять их координаты. Начал вот с этого:

Код:
#include <windows.h>
#include <commctrl.h>
#include <iostream>

using namespace std;

int main(void)
{   
   HWND DesktopHandle = FindWindow("ProgMan",NULL);   
   DesktopHandle = GetWindow(DesktopHandle, GW_CHILD);
   int count = SendMessage(DesktopHandle, LVM_GETITEMCOUNT,0,0); // получить кол-во ярлыков на рабочем столе
   cout << count;
 // должна выровнять все ярлыки на раб. столе по левому краю
   SendMessage(DesktopHandle, LVM_ARRANGE, LVA_ALIGNLEFT, 0); 
   return 0;
}
не работает ни одна. Ошибок нет.

Последний раз редактировалось NiCola999; 01.07.2010 в 02:19.
NiCola999 вне форума Ответить с цитированием
Старый 01.07.2010, 09:51   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
   HWND DesktopHandle = FindWindow("ProgMan",NULL);   
   DesktopHandle = GetWindow(DesktopHandle, GW_CHILD);
 // Еще раз - в ХР по крайней мере
   DesktopHandle = GetWindow(DesktopHandle, GW_CHILD);
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.07.2010, 10:21   #3
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

о, спасибо)

сразу скажу что компилятор G++

как получить координаты ярлыка?

Код:
POINT p;
SendMessage(0, LVM_GETITEMPOSITION,0, &p);
у нее в кач-ве параметра LPARAM... как сделать чтобы в p были координаты?

а так же мне интересно:
1) как получить имя i-того ярлыка, знаю что LVM_GETITEMTEXT, но как применить не понял, она опять же возвращает свой тип, который непонятно как преобразовать в string или char*
2) сделать выделение i-того ярлыка, чтобы было видно, что он выделен (как выделение мышкой)

перерыл winapi , но по 2ому пункту не нашел ничего, наверно плохо искал)

Последний раз редактировалось Stilet; 01.07.2010 в 14:34.
NiCola999 вне форума Ответить с цитированием
Старый 01.07.2010, 14:35   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
как сделать чтобы в p были координаты?
Наверное банальным преобразованием типов:
SendMessage(0, LVM_GETITEMPOSITION,0, (LPARAM)p);
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.07.2010, 16:00   #5
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

Пробовал, не получается:
Код:
POINT p; // структура tegPOINT
ListView_SetItemPosition(dh, 10, 640,512); // центр экрана
// ярлык переместился, далее хочу вывести его координаты(просто так)
SendMessage(dh, LVM_GETITEMPOSITION,10,(LPARAM)&p);   
cout << p.x << "; " <<p.y << endl;
вывод 0;0

вот нашел пример, только на C#
непонятные мне места обозначил вопросами
Код:
IntPtr ptr =  // IntPtr указатель на int?
Marshal.AllocHGlobal(Marshal.SizeOf(typeof(POINT)) );  // я так понимаю это new POINT ?

POINT p;
p.x = 0;
p.y = 0;

Marshal.StructureToPtr(p, ptr, true); // ????

SendMessage(handle, LVM_GETITEMPOSITION, 0, ref ptr);

p = (POINT)Marshal.PtrToStructure(ptr,typeof(POINT)); // ????

Console.WriteLine("First Icon Position: (x = "+ p.x.ToString() + ", y = " + p.y.ToString() + ")");

Marshal.FreeHGlobal(ptr);

Последний раз редактировалось NiCola999; 01.07.2010 в 16:13.
NiCola999 вне форума Ответить с цитированием
Старый 01.07.2010, 20:16   #6
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

up....
NiCola999 вне форума Ответить с цитированием
Старый 01.07.2010, 20:47   #7
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

IntPtr - это указатель в принципе, то бишь не только на int )
второе вроде правильно, выделение неуправляемой памяти и помещение указателя на неё в ptr.
Marshal.StructureToPtr, то ли преобразует управляемый объект к неуправляемому, то ли что-то в этом роде, не помню точно; PtrToStructure, соответственно, наоборот ). То бишь все эти шаманства касаются только преобразованиями между управляемым и неуправляемым видом объекта, на с++ это долнжо выглядеть проще, как-то так:
Код:
POINT p = { 0, 0 };
SendMessage (handle, LVM_GETITEMPOSITION, 0, &p); 
std::cout << "First Icon Position: (x = " << p.x << ", y = " << p.y << ")";
...

а, у вас, собственно, так и написано, не заметил ) Попробуйте тогда дважды указатель
Код:
POINT p = { 0, 0 };
POINT* ptr = &p;
SendMessage (handle, LVM_GETITEMPOSITION, 0, &ptr);
:-) авось получится...

...

хотя нет, на мсдн написано, что POINT*.

Последний раз редактировалось netrino; 01.07.2010 в 20:51.
netrino вне форума Ответить с цитированием
Старый 01.07.2010, 23:03   #8
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

....вот вот)
нашел еще один пример, на С++. Только мой компилятор не видит эти функции (commctrl и windows.h подключены)

Код:
    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, 0, 0));
    // 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); // аналогично
я так понимаю это MFC функции чтоли? В g++ их соответственно нету

Последний раз редактировалось NiCola999; 01.07.2010 в 23:20.
NiCola999 вне форума Ответить с цитированием
Старый 02.07.2010, 00:05   #9
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от NiCola999 Посмотреть сообщение
я так понимаю это MFC функции чтоли? В g++ их соответственно нету
Едва ли, на мсдн были бы описаны. Видимо самописные.

...

Нашёл ваш исходник Там в файле Processes.cpp описаны FindExplorerProcess.... ну видимо и остальные тоже по другим файлам лежат = )
netrino вне форума Ответить с цитированием
Старый 02.07.2010, 00:27   #10
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

неужели нету другого способа...
NiCola999 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отображение ярлыков на форме berlios Общие вопросы Delphi 20 26.12.2010 04:53
Создание ярлыков VeloceRAPTOR Общие вопросы Delphi 4 16.10.2010 23:40
Перемещение обьекта! TRIO JavaScript, Ajax 1 22.12.2008 19:49
Можно ли как то узнать координаты ярлыков и папок и программно перемещать их? [Smarik] Win Api 3 21.12.2008 12:50
Пуска нет и ярлыков никаких! Папка Мои документы и всё! anton14 Свободное общение 8 26.04.2008 13:31