Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Расположение иконок на рабочем столе


Автор: Vano-K 28.11.2005, 23:17
Суть темы такова:
Необходимо сохранить расположение иконок на рабочем столе, и при неоюходимости восстановить их.
Но полностью расписать код мне не надо, мне необходимо только узнать, где хранятся такие данные.
Я уже не знаю что делать. Снахало думал в реестре. Но после нескольких дней я ничего добится не смог.
В 98 сделал себе прогу, там было легко найти, а вот в ХР что - то некак. А пользоваться какими то программами не очень хочется, так как они либо кривые, либо тупые, либо нестадильные, либо не функциональные.
Подскажите кто чем может мыло моё [removed by moderator]
буду очень признателен.

Модератор: настройте себе уведомления об изменениях (подписка на тему).

Автор: ~FoX~ 29.11.2005, 14:57
Все оч просто рабочий стол покрыт компонентом ListView его Item-ы и есть ярлычки.
Тебе нужно получить хэндл этого объекта для работы с ним.
Вот как это выглядит на делфи:

Код

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;

Вот как задать позицию ярлыка с номером I
Код

ListView_SetItemPosition(GetDesktopListViewHandle,i,x,y);

Так же можно задать расположение например по правому краю:
Код

SendMessage(GetDesktopListViewHandle, LVM_ALIGN, LVA_ALIGNLEFT, 0); 

Описание всех АПИ (FindWindow, GetWindow, GetClassName) можно найти в МСДН
На барсик сам сможешь переварить

Автор: ~FoX~ 1.12.2005, 09:08
Вот тебе код модуля с описаниями всех АПИ и функция возвращающая Хэндл рабочего стола:
Код

Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, _
                        ByVal wCmd As Long) As Long

Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _
              (ByVal hwnd As Long, _
               ByVal lpClassName As String, _
               ByVal nMaxCount As Long) As Long


Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
        (ByVal lpClassName As String, _
         ByVal lpWindowName As String) As Long

Declare Function SendMessage Lib "user32" Alias _
         "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
         ByVal wParam As Long, lParam As Any) As Long


Public Const GW_CHILD = 5


Public Function GetDesktopListViewHandle() As Long
Dim Hndl As Long
Dim S As String
Dim Length As String
  S = Space(13)
  Hndl = FindWindow("ProgMan", vbNullString)
  Hndl = GetWindow(Hndl, GW_CHILD)
  Hndl = GetWindow(Hndl, GW_CHILD)
  Length = GetClassName(Hndl, S, 40)
  If S <> "SysListView32" Then
    GetDesktopListViewHandle = 0
  Else
    GetDesktopListViewHandle = Hndl
  End If
End Function

Автор: 07pov23 16.1.2009, 13:32
Цитата(~FoX~ @  29.11.2005,  14:57 Найти цитируемый пост)
Вот как задать позицию ярлыка с номером I
Выделить всёкод Pascal/Delphi
1:
    
ListView_SetItemPosition(GetDesktopListViewHandle,i,x,y);

А как получить доступ к этому ListView?

Автор: Akina 16.1.2009, 16:42
По полученному хендлу, собсно.

Автор: ~FoX~ 19.1.2009, 17:19
07pov23, Иеххх...

Код

  Const LVM_GETITEMCOUNT As Long = 4100 'волшебное число
  Const LVM_SETITEMPOSITION = 4111' ище адно волшебное число
  Dim IconCount as Integer ' количество итемов..
  dim i as Integer

  IconCount = SendMessage(SLV, LVM_GETITEMCOUNT, 0, 0) ' получаем количество итемов..
  for i = 0 to IconCount
    SendMessage(SLV,  LVM_SETITEMPOSITION , i, x, y) ' получаем количество итемов..
  next i

Все волшебные числа можно найти в МСДН. 
Для получения координат используй LVM_GETITEMPOSITION, номер найдешь в том же МСДН-е

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)