Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с иконками... ...на рабочем столе 
:(
    Опции темы
Budy
  Дата 11.2.2005, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 616
Регистрация: 6.2.2004
Где: Екатеринбург

Репутация: 1
Всего: 2



:Приветствую
Возникла надобность в написании программы, которая будет устанавливать позиции иконок на раб.столе.
1) получить позиции и имена всех иконок (папок, ярлыков, корзины - всех объектов раб.стола)
2) размещение иконок в нужные позиции

Просто пользуюсь кое-каким эмулятором - изучаю высшую математику smile после его закрытия все иконки "разлетаются" в разные места, иногда за пределы раб. стола и приходится все заново настраивать. Надоело короче.

Помогите плз чем могите...


--------------------
Как ты назовешь свой корабль, так на нем и напишут
user posted image
PM MAIL WWW ICQ   Вверх
~FoX~
Дата 11.2.2005, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 0
Всего: 68



Рабочий стол перекрыт сверху компонентом 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;



Добавлено @ 16:09
Тока я не врубился почему в этом разделе?


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
p0s0l
Дата 11.2.2005, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Перенесенно из раздела Delphi


--------------------
С уважением, г-н Посол.
PM   Вверх
Budy
Дата 12.2.2005, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 616
Регистрация: 6.2.2004
Где: Екатеринбург

Репутация: 1
Всего: 2



~FoX~, да я разделом ошибся, а когда хотел в другой перенести, то с сайтом какието проблемы были.....


--------------------
Как ты назовешь свой корабль, так на нем и напишут
user posted image
PM MAIL WWW ICQ   Вверх
Budy
Дата 12.2.2005, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 616
Регистрация: 6.2.2004
Где: Екатеринбург

Репутация: 1
Всего: 2



~FoX~, а как поймать?
Код

ListView_GetItemPosition(hwndLV: HWND; i: Integer;  var ppt: TPoint): Bool;

Шо за ppt??
Добавлено @ 20:28
ЗЫ.Мне нужно позиции их узнать, а потом только изменить


--------------------
Как ты назовешь свой корабль, так на нем и напишут
user posted image
PM MAIL WWW ICQ   Вверх
~FoX~
Дата 17.2.2005, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 0
Всего: 68




Код

unit dipsdef;

interface

uses
Windows, CommCtrl;

const
RegSubKeyName = 'Software\LVT\Desktop Item Position Saver';

procedure RestoreDesktopItemPositions;
procedure SaveDesktopItemPositions;

implementation

uses
uvirtalloc, registry;

procedure SaveListItemPosition(LVH : THandle; RemoteAddr : Pointer);
var
lvi : TLVITEM;
lenlvi : integer;
nb : integer;
buffer : array [0..MAX_PATH] of char;
Base : Pointer;
Base2 : PByte;
i, ItemsCount : integer;
Apoint : TPoint;
key : HKEY;
Dummy : integer;
begin
ItemsCount := SendMessage(LVH, LVM_GETITEMCOUNT, 0, 0);
Base := RemoteAddr;
lenlvi := SizeOf(lvi);
FillChar(lvi, lenlvi, 0);
lvi.cchTextMax := 255;
lvi.pszText := Base;
inc(lvi.pszText, lenlvi);

WriteToRemoteBuffer(@lvi, Base, 255);

Base2 := Base;
inc(Base2, Lenlvi);

RegDeleteKey(HKEY_CURRENT_USER, RegSubKeyName);

RegCreateKeyEx(HKEY_CURRENT_USER,
  PChar(RegSUbKeyName),
  0,
  nil,
  REG_OPTION_NON_VOLATILE,
  KEY_SET_VALUE,
  nil,
  key,
  nil);

for i := 0 to ItemsCount - 1 do
begin
  nb := SendMessage(LVH, LVM_GETITEMTEXT, i, LParam(Base));

  ReadRemoteBuffer(Base2, @buffer, nb + 1);
  FillChar(Apoint, SizeOf(Apoint), 0);

  WriteToRemoteBuffer(@APoint, Base2, SizeOf(Apoint));
  SendMessage(LVH, LVM_GETITEMPOSITION, i, LParam(Base) + lenlvi);

  ReadRemoteBuffer(Base2, @Apoint, SizeOf(Apoint));
  RegSetValueEx(key, @buffer, 0, REG_BINARY, @Apoint, SizeOf(APoint));
end;
RegCloseKey(key);
end;


procedure RestoreListItemPosition(LVH : THandle; RemoteAddr : Pointer);
type
TInfo = packed record
  lvfi : TLVFindInfo;
  Name : array [0..MAX_PATH] of char;
end;
var
SaveStyle : Dword;
Base : Pointer;
Apoint : TPoint;
key : HKey;
idx : DWord;
info : TInfo;
atype : Dword;
cbname, cbData : Dword;
itemidx : DWord;
begin
SaveStyle := GetWindowLong(LVH, GWL_STYLE);
if (SaveStyle and LVS_AUTOARRANGE) = LVS_AUTOARRANGE then
  SetWindowLong(LVH, GWL_STYLE, SaveStyle xor LVS_AUTOARRANGE);

RegOpenKeyEx(HKEY_CURRENT_USER, RegSubKeyName, 0, KEY_QUERY_VALUE, key);

FillChar(info, SizeOf(info), 0);
Base := RemoteAddr;

idx := 0;
cbname := MAX_PATH;
cbdata := SizeOf(APoint);

while (RegEnumValue(key, idx, info.Name, cbname, nil, @atype, @Apoint, @cbData) <>
  ERROR_NO_MORE_ITEMS) do
begin
  if (atype = REG_BINARY) and (cbData = SizeOf(Apoint)) then
  begin
    info.lvfi.flags := LVFI_STRING;
    info.lvfi.psz := Base;
    inc(info.lvfi.psz, SizeOf(info.lvfi));
    WriteToRemoteBuffer(@info, Base, SizeOf(info.lvfi) + cbname + 1);
    itemidx := SendMessage(LVH, LVM_FINDITEM, - 1, LParam(Base));
    if itemidx > -1 then
      SendMessage(LVH, LVM_SETITEMPOSITION, itemidx, MakeLong(Apoint.x, Apoint.y));
  end;
  inc(idx);
  cbname := MAX_PATH;
  cbdata := SizeOf(APoint);
end;
RegCloseKey(key);

SetWindowLong(LVH, GWL_STYLE, SaveStyle);
end;

function GetSysListView32: THandle;
begin
Result := FindWindow('Progman', nil);
Result := FindWindowEx(Result, 0, nil, nil);
Result := FindWindowEx(Result, 0, nil, nil);
end;

procedure SaveDesktopItemPositions;
var
pid : integer;
rembuffer : PByte;
hTarget : THandle;
begin
hTarget := GetSysListView32;
GetWindowThreadProcessId(hTarget, @pid);
if (hTarget = 0) or (pid = 0) then
  Exit;
rembuffer := CreateRemoteBuffer(pid, $FFF);
if Assigned(rembuffer) then
begin
  SaveListItemPosition(hTarget, rembuffer);
  DestroyRemoteBuffer;
end;
end;

procedure RestoreDesktopItemPositions;
var
hTarget : THandle;
pid : DWord;
rembuffer : PByte;
begin
hTarget := GetSysListView32;
GetWindowThreadProcessId(hTarget, @pid);
if (hTarget = 0) or (pid = 0) then
  Exit;
rembuffer := CreateRemoteBuffer(pid, $FFF);
if Assigned(rembuffer) then
begin
  RestoreListItemPosition(hTarget, rembuffer);
  DestroyRemoteBuffer;
end;
end;

end.

{----------------------------------------------------------}

unit uvirtalloc;

interface

uses
Windows, SysUtils;

function CreateRemoteBuffer(Pid : DWord; Size: Dword): PByte;
procedure WriteToRemoteBuffer(Source : PByte;
                             Dest : PByte;
                             Count : Dword);

function ReadRemoteBuffer (Source : PByte;
                          Dest : PByte;
                          Count : Dword): Dword;

procedure DestroyRemoteBuffer;

implementation

var
hProcess : THandle;
RemoteBufferAddr: PByte;
BuffSize : DWord;

function CreateRemoteBuffer;
begin
RemoteBufferAddr := nil;
hProcess := OpenProcess(PROCESS_ALL_ACCESS, FALSE, Pid);
if (hProcess = 0) then
  RaiseLastWin32Error;

Result := VirtualAllocEx(hProcess,
                          nil,
                          Size,
                          MEM_COMMIT,
                          PAGE_EXECUTE_READWRITE);

Win32Check(Result <> nil);
RemoteBufferAddr := Result;
BuffSize := Size;
end;

procedure WriteToRemoteBuffer;
var
BytesWritten: Dword;
begin
if hProcess = 0 then
 Exit;
Win32Check(WriteProcessMemory(hProcess,
                              Dest,
                              Source,
                              Count,
                              BytesWritten));
end;

function ReadRemoteBuffer;
begin
Result := 0;
if hProcess = 0 then
   Exit;

Win32Check(ReadProcessMemory(hProcess,
                              Source,
                              Dest ,
                              Count,
                              Result));
end;

procedure DestroyRemoteBuffer;
begin
 if (hProcess > 0)  then
   begin
     if Assigned(RemoteBufferAddr) then
       Win32Check(Boolean(VirtualFreeEx(hProcess,
                                        RemoteBufferAddr,
                                        0,
                                        MEM_RELEASE)));
     CloseHandle(hProcess);
   end;
end;
end.

Здесь почитай


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0477 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.