Форум: "Система";
Текущий архив: 2003.05.19;
Скачать: [xml.tar.bz2];
ВнизМетки дисков Найти похожие ветки
← →
Bartov (2003-03-20 05:55) [0]Hi, всем.
Возникла проблема.
Как можно узнать о том, что изменилась метка диска.
Есть ли какой-нибудь wm_xxx, с помощью которого можно отслеживать их изменения, а то через таймер не охото проверять.
Или как можно сделать это красиво?
Спасибо.
← →
Bartov (2003-03-20 14:35) [1]Мда... Что-то все молчат ;-(
← →
Игорь Шевченко (2003-03-20 14:56) [2]Молчат, потому что нету WM_xxxxx. Даже WM_DEVICECHANGE не пошлется. И среди Volume management functions нет никаких Notifications. А Device какой - removable или нет ? Потому как для Removable WM_DEVICECHANGE посылается при смене тома.
← →
Bartov (2003-03-20 15:48) [3]> А Device какой - removable или нет ? Потому как для Removable WM_DEVICECHANGE посылается при смене тома.
Хочу винт отловить.
Не уж-то таймер вешать?...
> Даже WM_DEVICECHANGE не пошлется
На WM_DEVICECHANGE я повесил обновление списка с усройствами, если добавлено/удалено устройство (тип volome) и так же CD/DVD всунули/высунули - вот здесь метка и поменялась. ;-)
А вот и примерчик откуда брал:
http://delphikol.narod.ru/project_jedi/Dbt.zip
← →
Игорь Шевченко (2003-03-20 16:22) [4]Bartov (20.03.03 15:48)
У винта таймер вешать. А как часто у винта метка тома меняется ?
← →
Bartov (2003-03-20 17:06) [5]Не часто, спору нет.
Думаю интервал в 3 секунды будет достаточен.
Хотя Эксплорер как-то обрабатывает это изменение, если даже окно не активно, т.е. на заднем фоне.
Вот всем знакомая ф-ция получения метки тома, но вней два недостатка:
var
NotUsed: DWORD;
Buf: array [0..MAX_PATH - 1] of Char;
begin
Buf := #0;
GetVolumeInformation(PChar(Drv + "\\"), Buf, DWORD(SizeOf(Buf)), nil, NotUsed, NotUsed, nil, 0);
Result := Buf;
end;
1. Если сделать Drv + "\", то не всегда под Виндой 9х будет отображаться правильно, под XP все нормально.
2. Возращает Дос метку, т.е. не учитывает регистр букв.
Эту ф-цию реально использовать только для того, чтобы проверить есть ли на самом деле метка или нет, т.е. String <>"".
А вот варинат как получить Виндовую метку:
var
NotUsed: DWORD;
SFI: TShFileInfo;
begin
FillChar(SFI, SizeOf(SFI), 0);
ShGetFileInfo(PChar(Drv + "\"), 0, SFI, SizeOf(SFI), SHGFI_DISPLAYNAME);
Result := SFI.szDisplayName;
if Result = "" then //== Для Win9x, когда нет меток дисков
Result := "<none>"
else if Pos("(", Result) <> 0 then
SetLength(Result, Pos("(", Result) - 2);
end;
И работает на ура.
← →
Игорь Шевченко (2003-03-20 17:16) [6]
> Эксплорер как-то обрабатывает это изменение
Поищи по undocumented Shell, там весьма вероятно может быть, но оно сильно зависит от версии Shell32.dll
← →
Bartov (2003-03-21 07:43) [7]Ладно, закрываю тему.
Если найду как лучше, то напишу...
← →
Bartov (2003-03-22 09:40) [8]Из MSDN 2002
ms-help://MS.MSDNQTR.2002JUL.1033/devio/deviceman_9z77.htm
Смотри
GUID_IO_VOLUME_CHANGE - The volume label has changed.
← →
Bartov (2003-03-22 11:03) [9]SetVolumeLabel - устанавливает ДОС метки, т.е. в верхнем регистре, а как тогда сделать чтоб было System, а не SYSTEM?
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2003.05.19;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c