C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Ярлык
** avtoritet
Отправлено: 03.09.2004, 01:36


Не зарегистрирован







У меня такой вот вопросик: кто-нибудь знает как сдвинуть ярлыки на рабочем столе допустим на пару см в низ?
joynter
Отправлено: 03.09.2004, 09:14


Станционный диспетчер

Группа: Участник
Сообщений: 137



ctrl+A а дальше мышой .... шутка
смотри функцию
BOOL MoveWindow(

HWND hWnd, // handle of window
int X, // horizontal position
int Y, // vertical position
int nWidth, // width
int nHeight, // height
BOOL bRepaint // repaint flag
);
Konstantine
Отправлено: 03.09.2004, 09:53


Мастер участка

Группа: Модератор
Сообщений: 545



А хендл на 1 значёк где взять?
joynter
Отправлено: 03.09.2004, 10:18


Станционный диспетчер

Группа: Участник
Сообщений: 137



struct TSearchRec link;
handle = FindFirst("C:\\Documents and Settings\\_юзверь_\\Рабочий стол\\*.lnk",faAnyFile, &link)
FindNext .....
и перебираешь все до нужной иконки

ps: у меня 2к, так что где у остальных рабочий стол не имею представления.

Отредактировано joynter — 03/09/2004, 11:21
UA_Freeman
Отправлено: 03.09.2004, 12:25


Дежурный стрелочник

Группа: Участник
Сообщений: 31



joynter, ты что, прикалываешься, да?
Для MoveWindow нада HWND, а FindFirst, как ты сам написал, даёт struct TSearchRec
К чему тут вообще FindFirst??? Да и MoveWindow тоже, вообще то не поможет...

2Konstantine: Возможно, проще всего действительно было бы нажать Ctrl+A и мышкой вниз тянуть? Для этих делов смотри keybd_event и
mouse_event, там всё довольно-таки просто.

Хотя, на самом деле по-хорошему там всё делается через COM
joynter
Отправлено: 03.09.2004, 12:38


Станционный диспетчер

Группа: Участник
Сообщений: 137



моя ошибка
CODE
handle = FindFirst("C:\\Documents and Settings\\_юзверь_\\Рабочий стол\\*.lnk",faAnyFile, &link)

кнечно же не handle a
int find_flag = FindFirst("C:\\Documents and Settings\\_юзверь_\\Рабочий стол\\*.lnk",faAnyFile, &link)


struct TSearchRec
{
int Time; // время создания
int Size; // размер файла
int Attr; // атрибуты
System::AnsiString Name; // имя файла
int ExcludeAttr;
int FindHandle; //дескриптор
_WIN32_FIND_DATAA FindData;
} ;

по-моему FindHandle — именно то, что требуется
возможно я не прав — сам не тестил
UA_Freeman
Отправлено: 03.09.2004, 12:45


Дежурный стрелочник

Группа: Участник
Сообщений: 31



QUOTE (joynter @ 03/09/2004, 12:40)
по-моему FindHandle — именно то, что требуется
возможно я не прав — сам не тестил

Ну конечно же нет! FindFirst предназначен для работы с файлами соотвествущими определённой маске. Спаршивается, причём тут окна и HWND ? И вообще при чём тут окна к иконкам????

Отредактировано UA_Freeman — 03/09/2004, 12:50
joynter
Отправлено: 03.09.2004, 12:52


Станционный диспетчер

Группа: Участник
Сообщений: 137



CODE
! FindFirst предназначен для работы с файлами соотвествущими определённой маске.

1.стало быть маска_ярлыка = *.lnk (xxx.lnk тоже файл)
2.если FindHandle не дескриптор найденного файла, то объясните пожалуйста чей это дескриптор?
** avtoritet
Отправлено: 03.09.2004, 13:04


Не зарегистрирован







yointer, в папке рабочий стол у меня 10 ярлыков. А на самом рабочем столе у меня их 18. ЧТо за ... ?
Freeman, нахер нам по хорошому. Для чего мы изучаем программирование?
А так то, надо указать винде, чтобы ярлыки начала размещать не сразу сверху, а пару см пропустив. Тогджа они сами и сдвинутся? Как считаете?
Guest
Отправлено: 03.09.2004, 13:16


Не зарегистрирован







2joynter
А Какое отношение дескриптор найденого файла имеет к дескриптору окна (кроме общего слова 'дескриптор') ?
joynter
Отправлено: 03.09.2004, 13:17


Станционный диспетчер

Группа: Участник
Сообщений: 137



ярлыки — это х..ня со стрелочкой в левом нижнем углу
а то, чего в твоей папке "рабочий стол" не хватает, лежит в папке All Users
а вот что такое "мой компьютер", "мои документы" и пр. и где оно лежит я не знаю.
UA_Freeman
Отправлено: 03.09.2004, 13:26


Дежурный стрелочник

Группа: Участник
Сообщений: 31



QUOTE (joynter @ 03/09/2004, 12:54)
если FindHandle не дескриптор найденного файла, то объясните пожалуйста чей это дескриптор?

FindHandle — скрытая от программиста структура, в которой находится информация о том, какой поиск и с какой маской сейчас ведётся, плюс текущая позиция в списке файлов. Для того, чтобы получить дескриптор файла, нужно воспользоваться функцией CreateFile. Но, как правильно сказал Гость, и как я уже два раза говорил, при чём тут дескриптор файла(HANDLE) к дескриптору окна(HWND)????
Плюс, иконки на рабочем столе окна собой не представляют, потому функией MoveWindow ты их не подвинешь

2** avtoritet: В падло по хорошему, сэмулируй нажатия клавиш, как я уже говорил, это несложно
Guest
Отправлено: 03.09.2004, 13:28


Не зарегистрирован







** avtoritet. Остальное у вас лежит, по видимому, в All Users
UA_Freeman
Отправлено: 03.09.2004, 13:30


Дежурный стрелочник

Группа: Участник
Сообщений: 31



Вообще-то, Мой компьютер и Мои документы, так же Сетевое окружение и проч., .lnk файлами как таковыми не являются, а добавляются самой виндой в зависимости от настроек
** avtoritet
Отправлено: 03.09.2004, 13:40


Не зарегистрирован







Ну вот вы! Я и сам знаю что и где у меня лежит!Не впервые комп вижу! Н..й симулировать нажатия клавишь. Надо системно указать, чтобы ярлыки сдвинулись.
Что вы думаете насчет FindWindows? Или SystemParametersInfo?
** avtoritet
Отправлено: 03.09.2004, 15:06


Не зарегистрирован







По моему, наши рассуждения ни к чему правильному не привели. Верно? Поэтому, предлагаю:
1)Как правильно создать ярлык?
2)Имееются ли там параметры в каких координатах создовать?
3)Мне не дает покояы функция FindWindows?
Gedeon
Отправлено: 03.09.2004, 15:41


Ветеран

Группа: Модератор
Сообщений: 1742



Нет, FindWindow тут не поможет, попробуйте Spy++ найти че-нить на дэсктопе, не найдете, надо подумать, самому интересно стало.

Спустя некоторое время biggrin.gif

Кажись понял, ярлыки двигать программно, кроме как при нажатии клавиш невозможно. Вы можете его создать, удалить и все. Местоположение и название ярлыков хранится в реестре
HKEY_CURRENT_USER\Software\EnTech\Layot\1024,768
или
HKEY_USERS\S-(куча цифр)\Software\EnTech\Layot\1024,768

Че там к чему, как сохраняется положение хрен его зает это 1
и 2 попробуйте передвинуть мышей ярлык и перегрузить комп с рэзетом, он вернется на старое место. Т.Е. комп сохраняет в реестре положение ярлыков при выгрузке и берет при загрузке. Все кажись.

Отредактировано Gedeon — 03/09/2004, 17:05
joynter
Отправлено: 03.09.2004, 15:51


Станционный диспетчер

Группа: Участник
Сообщений: 137



а вообще как ссылку (типа иконку) на рабочий стол положить?
какая API это делает?
UA_Freeman
Отправлено: 03.09.2004, 15:51


Дежурный стрелочник

Группа: Участник
Сообщений: 31



QUOTE (** avtoritet @ 03/09/2004, 15:08)
1)Как правильно создать ярлык?
2)Имееются ли там параметры в каких координатах создовать?

Как создаётся ярлык я сейчас точно не помню, кажется, через COM интерфейс IShellIcon.... Но там ТОЧНО не указываются его координаты.

Отредактировано UA_Freeman — 03/09/2004, 15:53
Gedeon
Отправлено: 03.09.2004, 16:06


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (joynter @ 03/09/2004, 16:53)
а вообще как ссылку (типа иконку) на рабочий стол положить?

Borland C++ Builder FAQ
joynter
Отправлено: 03.09.2004, 16:07


Станционный диспетчер

Группа: Участник
Сообщений: 137



копаясь в SDK наткнулся на функцию GetSystemMetrics c параметрами
SM_CXICON, SM_CYICON и SM_CXICONSPACING, SM_CYICONSPACING

на сколько я понимаю — рабочий стол делится на квадраты размером
SM_CXICONSPACING на SM_CYICONSPACING, куда вписывается иконка размером SM_CXICON на SM_CYICON
т.е. отступ от края стола не может быть произвольным
joynter
Отправлено: 03.09.2004, 17:00


Станционный диспетчер

Группа: Участник
Сообщений: 137



билдер сказал
[C++ Error] shobjidl.h(2193): E2238 Multiple declaration for 'FOLDERSETTINGS'
[C++ Error] shobjidl.h(8095): E2238 Multiple declaration for 'DESKBANDINFO'
[C++ Error] shlobj.h(1422): E2238 Multiple declaration for 'FVSHOWINFO'
[C++ Error] shlobj.h(3457): E2238 Multiple declaration for 'SHELLFLAGSTATE'
компилируя файл по GEDEON ссылке, причем множественное декларирование было в objidl.h и shlobj.h

я опять что-то не правильно сделал?
** avtoritet
Отправлено: 03.09.2004, 19:06


Не зарегистрирован







Давайте сначала сделаем ярлык. Заходил на Borland Faq, заеб..ся разбираться, но никак не скачал пример. Может кто-нибудь пример разместит в теме?
Gedeon
Отправлено: 06.09.2004, 11:16


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (** avtoritet @ 03/09/2004, 20:08)
Может кто-нибудь пример разместит в теме?

CODE

#include <windows.h>
#include <objidl.h>
#include <shlobj.h>
...
//---------------------------------------------------------------------
#define HOTKEY(modifier,key) ((((modifier)&0xff)<<8)|((key)&0xff))
//---------------------------------------------------------------------
// Создание ярлыка
// Входные параметры:
// pwzShortCutFileName — путь и имя ярлыка, например, "C:\\Блокнот.lnk"
// Если не указан путь, ярлык будет создан в папке, указанной в следующем параметре.
// Прим.: Windows сама НЕ добавляет к имени расширение .lnk
// pszPathAndFileName - путь и имя exe-файла, например, "C:\\Windows\\NotePad.Exe"
// pszWorkingDirectory — рабочий каталог, например, "C:\\Windows"
// pszArguments - аргументы командной строки, например, "C:\\Doc\\Text.Txt"
// wHotKey  — горячая клавиша, например, для Ctrl+Alt+A HOTKEY(HOTKEYF_ALT|HOTKEYF_CONTROL,'A')
// iCmdShow - начальный вид, например, SW_SHOWNORMAL
// pszIconFileName  — путь и имя файла, содержащего иконку, например, "C:\\Windows\\NotePad.Exe"
// int iIconIndex - индекс иконки в файле, нумеруется с 0
bool __fastcall CreateShortCut(
LPWSTR pwzShortCutFileName,
LPTSTR pszPathAndFileName,
LPTSTR pszWorkingDirectory,
LPTSTR pszArguments,
WORD wHotKey,
int iCmdShow,
LPTSTR pszIconFileName,
int iIconIndex) {
IShellLink * pSL;
IPersistFile * pPF;
HRESULT hRes;
// Получение экземпляра компонента "Ярлык"
hRes = CoCreateInstance(CLSID_ShellLink,
0,
CLSCTX_INPROC_SERVER,
IID_IShellLink,
(LPVOID *)&pSL);
if( SUCCEEDED(hRes) ) {
hRes = pSL->SetPath(pszPathAndFileName);
if( SUCCEEDED(hRes) ) {
hRes = pSL->SetArguments(pszArguments);
if( SUCCEEDED(hRes) ) {
hRes = pSL->SetWorkingDirectory(pszWorkingDirectory);
if( SUCCEEDED(hRes) ) {
hRes = pSL->SetIconLocation(pszIconFileName,iIconIndex);
if( SUCCEEDED(hRes) ) {
hRes = pSL->SetHotkey(wHotKey);
if( SUCCEEDED(hRes) ) {
hRes = pSL->SetShowCmd(iCmdShow);
if( SUCCEEDED(hRes) ) {
// Получение компонента хранилища параметров
hRes = pSL->QueryInterface(IID_IPersistFile,(LPVOID *)&pPF);
if( SUCCEEDED(hRes) ) {
// Сохранение созданного ярлыка
hRes = pPF->Save(pwzShortCutFileName,TRUE);
pPF->Release();
}
}
}
}
}
}
}
pSL->Release();
}
return SUCCEEDED(hRes);
}

Я проверял на консольном приложении, все работает, видимо FOLDERSETTINGS, DESKBANDINFO, FVSHOWINFO, SHELLFLAGSTATE обьявлены еще где-то в VCL.

Отредактировано Gedeon — 06/09/2004, 12:20

Вернуться в Вопросы программирования в C++Builder