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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.01.2010, 15:21   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию Переместить ярлыки на позиции на рабочем столе.

Запускаю XP на виртуальной машине. Дабы нормально раскрывалось на весь экран приходится запускать в оконном режиме затем переключаться (CTRL+F) на весь экран. Благодаря постоянной смене разрешения экрана ярлыки на раб столе перемещаются так, чтобы умещаться на столе при низком разрешении. При разрешении 1024*768 они (разумеется) перемещаться обратно не думают. Поэтому решил соорудить прогу на дельфи для устранения этой проблемы. Бесформенное приложение сидит в памяти и раз в 2 секунды проверяет разрешение экрана. Если <1024*768, то перемещает ярлыки. Ярлыков немного: "Мой компьютер" - Лев. верхний угол,"Мои Документы" - под "мой к.",папка "Programming" - левый нижний угол, ярлык "Alius" - правее "Programming", ярлык "Project AGI" - правее "Alius",папка "Games" - правый верхний угол, "Корзина" - правый нижний угол.

Вопрос: Возможно ли создать такую программку и что для этого использовать (разумею не среду, а команды)?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 02.01.2010, 15:31   #2
IT-man
АльTRUEи$т
Форумчанин
 
Аватар для IT-man
 
Регистрация: 19.03.2009
Сообщений: 784
По умолчанию

Цитата:
Рабочий стол перекрыт сверху компонентом ListView. Вам просто необходимо взять хэндл этого органа управления. Пример:
Код:
function GetDesktopListViewHandle: THandle;
var
  S: String;
begin
  Result := FindWindow('ProgMan', nil);
  Result := GetWindow(Result, GW_CHILD);
  Result := GetWindow(Result, GW_CHILD);
  SetLength(S, 40);
  GetClassName(Result, PChar(S), 39);
  if PChar(S) <> 'SysListView32' then 
    Result := 0;
end;
Цитата:
После того, как Вы взяли тот хэндл, Вы можете использовать API этого ListView, определенный в модуле CommCtrl, для того, чтобы манипулировать рабочим столом. Смотрите тему "LVM_xxxx messages" в оперативной справке по Win32.
К примеру, следующая строка кода:
Код:
{Не забудьте в uses добавить CommCtrl}
ListView_SetItemPosition(GetDesktopListViewHandle,i,x,y);
Цитата:
ярлыку с индексом i, задаст координаты (x,y). К примеру Мой компьютер имеет индекс 0, т.е i:=0;
К примеру, следующая строка кода:
Код:
SendMessage( GetDesktopListViewHandle, LVM_ALIGN, LVA_ALIGNLEFT, 0 );
Цитата:
разместит иконки рабочего стола по левой стороне рабочего стола Windows.
Цитата:
«Никто не войдет в Рай, имея хотя бы крупицу гордыни в своем сердце». «Аллах Красив и любит красоту. Гордыня означает отказ от истины и высокомерие»
IT-man вне форума Ответить с цитированием
Старый 02.01.2010, 15:37   #3
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Благодарю, буду пробовать.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 10.02.2010, 05:30   #4
Ergi
Новичок
Джуниор
 
Регистрация: 10.02.2010
Сообщений: 5
По умолчанию

Какая может быть ошибка, если уже первая строка Result := GetWindow(Result, GW_CHILD); возвращает 0?
Ergi вне форума Ответить с цитированием
Старый 10.02.2010, 07:50   #5
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от Ergi Посмотреть сообщение
Какая может быть ошибка, если уже первая строка Result := GetWindow(Result, GW_CHILD); возвращает 0?
Это аналог, если бы написать так:
Код:
Хочу сделать салат - мне надо взять: 1. салат

Думаю поняли. Вы передаете в GetWindow(Result.. а что такое Result ? Это уже Handle какого-то окна ?

Если же имелось ввиду все-таки не "первая" строка, а строка
Код:
Result := FindWindow('ProgMan', nil);
то удостоверьтесь что после ее выполнения Result <> 0
BOBAH13 вне форума Ответить с цитированием
Старый 10.02.2010, 07:59   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну например окно ProgMan не найдено, или у нее нет "детей" ну в смысле окно пустехонькое.
Цитата:
Это уже Handle какого-то окна ?
Да действительно: Автор, тебе ценный намек - проверять результаты возвращаемые функциями:
Код:
 
 Result := FindWindow('ProgMan', nil);
 if not IsWindow(result) then Это не окно
Цитата:
перемещаться обратно не думают
Пардон, а поставить галочку на "выровнять автоматически" уже не модно?
I'm learning to live...

Последний раз редактировалось Stilet; 10.02.2010 в 08:03.
Stilet вне форума Ответить с цитированием
Старый 10.02.2010, 20:04   #7
Ergi
Новичок
Джуниор
 
Регистрация: 10.02.2010
Сообщений: 5
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Это аналог, если бы написать так:
Код:
Хочу сделать салат - мне надо взять: 1. салат

Думаю поняли. Вы передаете в GetWindow(Result.. а что такое Result ? Это уже Handle какого-то окна ?

Если же имелось ввиду все-таки не "первая" строка, а строка
Код:
Result := FindWindow('ProgMan', nil);
то удостоверьтесь что после ее выполнения Result <> 0
Я поэтому и спрашиваю про ошибки в Result := GetWindow(Result, GW_CHILD);, потому что Result := FindWindow('ProgMan', nil); возвращает handle окна. Но далее дело не идет. Вместо верхнего дочернего окна ProgMan, она возвращает ноль. IsWindow возвращает true. А под первой строкой я подразумевал Result := GetWindow(Result, GW_CHILD);, так как их две. и еще вопросик чему равна константа GW_CHILD? Покопался в интернете, нашел GW_CHILD=5, но может я не прав?

Последний раз редактировалось Ergi; 10.02.2010 в 20:11.
Ergi вне форума Ответить с цитированием
Старый 10.02.2010, 20:35   #8
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
чему равна константа GW_CHILD
Держите CTRL и нажимаете на эту константу.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 10.02.2010, 20:39   #9
Ergi
Новичок
Джуниор
 
Регистрация: 10.02.2010
Сообщений: 5
По умолчанию

Извиняюсь, но пишу в vb, а не в delphi. Там такие переменные приходится вбивать вручную. А пишу у вас, т.к. нашел похожую проблему. Поэтому прошу вас нажать CTRL и сказать мне значение

Последний раз редактировалось Ergi; 10.02.2010 в 20:58.
Ergi вне форума Ответить с цитированием
Старый 11.02.2010, 08:53   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

GW_CHILD = 5;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Анимация на рабочем столе Djonik Помощь студентам 2 09.12.2009 19:58
кнопка на рабочем столе guffer Общие вопросы Delphi 3 08.07.2009 12:15
Пропадают ярлыки на рабочем столе через пару секунд, после загрузки всего стола. L@CO$TE Свободное общение 7 24.02.2009 14:46
Значки на рабочем столе Xardas Свободное общение 4 01.03.2008 20:21
SpeedButton на рабочем столе ERASERROR Общие вопросы Delphi 10 22.01.2008 16:58