Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2003.10.30;
Скачать: [xml.tar.bz2];

Вниз

Отлов сообщения об открытии/закрытии сидюка   Найти похожие ветки 

 
Dimaxx   (2003-08-02 22:41) [0]

Как получить состояние CD-ROM через mciSendCommand (MCI_STATUS)? И как получить MCIDEVICEID для двух и более сидюков в системе и как распознать где какой? Судя по всему, через MCI_STATUS можно получить состояние "открыт" или "закрыт" сидюк. Вот выдержка из хелпа:

The following additional standard and command-specific flags apply to all devices supporting MCI_STATUS:

MCI_STATUS_ITEM

Specifies that the dwItem member of the structure identified by lpStatus contains a constant specifying which status item to obtain. The following constants define which status item to return in the dwReturn member of the structure:

...

MCI_STATUS_MODE

The dwReturn member is set to the current mode of the device. The modes include the following:

MCI_MODE_NOT_READY // Кроме этого
MCI_MODE_PAUSE
MCI_MODE_PLAY
MCI_MODE_STOP
MCI_MODE_OPEN // По идее, он открыт, все остальное - закрыт.
MCI_MODE_RECORD
MCI_MODE_SEEK

Но я не могу получить MCIDEVICEID через mciGetDeviceID - что за строку ему нужно послать ("cdaudio" почему-то возвращает не то, что нужно)? Может я что-то не так делаю? Просветите!

Пишу я это потому, что нужно отследить в программе когда пользователь открыл/закрыл сидюк вручную. И вообще как узнать какой сидюк (в смысле, букву)? Или это проще сделать через winaspi32? Тогда мона узнать как через aspi сделать тоже самое? Винда же меняет значок сидюка, когда пользователь извлекает диск.


 
Dimaxx   (2003-08-04 00:44) [1]

Что? Неужели никто не знает? М-дя-а!!!


 
dvp   (2003-08-04 08:44) [2]

WM_DEVICECHANGE


 
HolACost   (2003-08-04 08:45) [3]

Что-то типа WM_DEVICECHANGE или WM_CHANGEDEVICE отлавливать! Смотри в нете - там подробнее написано что и какой из параметров обозначает - можно разделить на конкретное событие - сидюк всунут\высунут!


 
Dimaxx   (2003-08-04 23:31) [4]

Нашел я на каком-то сайтике примерчик. Запустил - шиш, ничего не определяет. С помошью WM_DEVICECHANGE мона отловить установку/снятие устройства. Вот тогда от отловит. А открытие/закрытие не подходит - я пробовал. Если интересует примерчик - все на мыло, вышлю. Потом может ткнете носом, где я не прав...


 
Ученик   (2003-08-04 23:58) [5]

>Dimaxx © (04.08.03 23:31)
Может CD не было в дисководе, тогда действительно сообщение не посылается при открытии/закрытии


 
Dimaxx   (2003-08-05 00:47) [6]

Диск в сидюке был и не был - одна фигня. Хотя это не должно влиять. А на это сообщение вообще никакой реакции не было...


 
Ученик   (2003-08-05 06:57) [7]


procedure WMDeviceChange(var Message: TMessage); message WM_DEVICECHANGE;

procedure TForm1.WMDeviceChange(var Message: TMessage);
begin
inherited;
ShowMessage("DeviceChange")
end;

Не работает ?


 
Dimaxx   (2003-08-05 23:52) [8]

Веришь-нет, но у меня в D5 под ХР не реагирует... Вышли на мыло свой работающий проект.


 
MacroDenS   (2003-08-06 10:23) [9]

Люди а че Вы паритесь?
Подобный вопрос уже неоднократно задавался на форуме, к примеру Как определить открыт ли сидиром?
На что после длительных рассуждений пришли к выводу, что нельзя этого определить, нету в виндах такого флага. Соответственно и этот вопрос попадает в ту же категорию. Однако надежды на то, что все-таки можно - живут.

Благодарю за внимание


 
Dimaxx   (2003-08-06 23:01) [10]

2 MacroDenS: А как, по-воему, винда опеределяет, что открыт сидюк и пора сменить иконку сидюка в "Мой компьютер" с той, что задана в autorun.inf на свою стандартную? WC Гислера тоже определяет открытие сидюка и меняет содержимое панели на "c:\". Там и там это как-то реализовано. Значит можно!


 
Yanis   (2003-08-07 02:57) [11]

To Dimaxx © (05.08.03 23:52)
К стати, всё работает.


 
MacroDenS   (2003-08-07 11:00) [12]

To Dimaxx ©
Да а к примеру такая фича, если после старта компа ты откроешь CD его тоже нормально определяются проги, что он именно открыт, а не что в нем нет диска?
А как, по-воему, винда опеределяет, что открыт сидюк и пора сменить иконку сидюка в "Мой компьютер" с той, что задана в autorun.inf на свою стандартную?
Винда определеяет не то что СД открыт, а то что в нем нет диска, знаешь есть такая вешь как переодическое обновление, в памяти хранится ссылка на иконку и каково удивление винды, кокда при очередном обновлении выясняется, что ресурса по ссылке нет.

НЕ ПУТАЙТЕ ОТСУТСТВИЕ ДИСКА С ОТКРЫТОЙ КАРЕТКОЙ СИДЮКА


 
Dimaxx   (2003-08-07 23:36) [13]

Так я про что и гутарю! Мне и нужно отследить открытие сидюка, а не отсутствие в нем диска.


 
salex   (2003-08-09 00:52) [14]

Может, конечно, глупый выход. Но если время от времени пытаться открыть файл с заведомо несуществующим именем с сидюка, то по коду возврата можно определить состояние.


 
Dimaxx   (2003-08-10 23:14) [15]

2 salex: Кстати, тоже выход. Надоть попробовать... Сенькс!


 
MacroDenS   (2003-08-11 11:11) [16]

to salex, здается мне, что при твоей версии приложение будет выдавать такую месагу, типа i/o Error 21(код ошибки точно не помню) устройство не готово!


 
Vlad25   (2003-08-11 19:53) [17]

А вот это вам подойдет?

(Источник:community.borland.com)
FAQ2907D.txt Detecting PlugNPlay hardware changes?
Category :Windows API
Platform :All
Product :All 32 bit

Question:
How do I correctly detect PlugNPlay hardware changes?

Answer:
You should create a WM_DEVICECHANGE message handler
to detect changes in PlugNPlay hardware.

Example:

type
TForm1 = class(TForm)
Button1: TButton;
private
{ Private declarations }
procedure WMDeviceChange(var Message: TMessage);
message WM_DEVICECHANGE;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

const DBT_DEVICEARRIVAL = $8000;
const DBT_DEVICEQUERYREMOVE = $8001;
const DBT_DEVICEQUERYREMOVEFAILED = $8002;
const DBT_DEVICEREMOVEPENDING = $8003;
const DBT_DEVICEREMOVECOMPLETE = $8004;
const DBT_DEVICETYPESPECIFIC = $8005;
const DBT_CONFIGCHANGED = $0018;

procedure TForm1.WMDeviceChange(var Message: TMessage);
var
s : string;
begin
{Do Something here}
case Message.wParam of
DBT_DEVICEARRIVAL :
s := "A device has been inserted and is now available";
DBT_DEVICEQUERYREMOVE: begin
s := "Permission to remove a device is requested";
ShowMessage(s);
{True grants premission}
Message.Result := integer(true);
exit;
end;
DBT_DEVICEQUERYREMOVEFAILED :
s := "Request to remove a device has been canceled";
DBT_DEVICEREMOVEPENDING :
s := "Device is about to be removed";
DBT_DEVICEREMOVECOMPLETE :
s := "Device has been removed";
DBT_DEVICETYPESPECIFIC :
s := "Device-specific event";
DBT_CONFIGCHANGED :
s:= "Current configuration has changed"
else s := "Unknown Device Message";
end;
ShowMessage(s);
inherited;
end;


 
Yanis   (2003-08-20 16:48) [18]

А вот это

TForm1 = class(TForm)
procedure ReceiveMessage (var Msg: TMessage); message WM_DEVICECHANGE;
private
{ Private declarations }
public
{ Public declarations }
end;

...

procedure TForm1.ReceiveMessage(var Msg: TMessage);
begin
if Msg.WParam=32772 then
ShowMessage("CD-ROM Open");

if Msg.WParam=32768 then
ShowMessage("CD-ROM Close");
end;



Страницы: 1 вся ветка

Форум: "Система";
Текущий архив: 2003.10.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.011 c
1-98696
col-isaev
2003-10-20 17:09
2003.10.30
Panel


14-98859
J.C. code
2003-10-10 19:45
2003.10.30
Управление окном


3-98496
AndB
2003-10-09 12:40
2003.10.30
Если CommandText


6-98759
Неумеха
2003-09-05 14:28
2003.10.30
Web-страницы через ShellExecute


1-98679
Ev1972
2003-10-21 13:32
2003.10.30
StretchDraw: как копировать часть рисунка?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский