** 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++ найти че-нить на дэсктопе, не найдете, надо подумать, самому интересно стало.
Спустя некоторое время
Кажись понял, ярлыки двигать программно, кроме как при нажатии клавиш невозможно. Вы можете его создать, удалить и все. Местоположение и название ярлыков хранится в реестре
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
|
|