ну если отправить комманду открытия, когда он открыт, или закрытия, когда он закрыт, и проверить на ошибки, в зависимости оттго удалась ли операция или нет, решать выполнить или нет противоположную. Или при отсылании комманды на CDRom, когда он уже закрыт или открыт нет ошибок, и так не получится?
если нет ошибок, то засеки время выполнения действия, должно выполниться около 2х секунд, иначе относительно быстро . Но это надёжно только при низкой загруженности процессора и CDRom'а.
Я просто делаю клавиатурную ловушку типа для добавления новых горячих клавиш конструкции WIN + какая-нить буква, и мне не хочется занимать две клавиши под CDRom поскольку меньше свободных остается в наличии, хочу поставить на WIN + C, и тут возникла эта проблема. Даже если в самой ловушке делать флаг, то это не панацея, тот же Alcohol или сам пользователь могут вдвигать и задвигать СDRom, ограничиться только открытием тоже плохо, поэтому можно поподробней про Код (Text): MECHANISM STATUS Command Operation code (BDh) это на си или дельфе сделать можно помимо масма, и че вообще эта штука делает?
RamMerLabs это ATAPI команда. надеюсь, у тебя есть черновой стандарт с их описанием и ты знаешь как их передавать устройству? она прямо возвращает бит, указывающий открыт лоток или закрыт. единственные грабли, которые я встретил с ней - если носитель не загружен, то при первом обращении к приводу, некоторые модели считают лоток открытым, даже если он закрыт. но это их багофича такая. если дать команду, работающую с носителем, у таких приводов мы услышим как включается мотор задвигающий лоток и лоток дергается, после чего приводод говорит "ага! вот теперь лоток уж точно загружен". seiko > это на си или дельфе сделать можно помимо масма, можно хоть на бацике другое дело, что это требеует прав админа... или установки ASPI32 драйвера от адаптек, который глючный как ладан. а так - набери в MSDN ключевое слово SPTI. там даже есть примеры сорцов на сях, в нете полго примеров на дельфинах. но в твоем случае можно не заморачиваться и просто юзать WM_DEVICECHANGE, что не требует прав админа и вообще позволяет забыть про ATAPI
насчет WM_DEVICECHANGE: насколько я понял нужно писать глобальный перехват этого сообщения в дллке или можно без длл?
kaspersky пасиб за столь подробное описание бага этой команды, имеено из-за него я и отказался от использования MECHANISM STATUS, когда интересовался этим.
seiko перехватывать ее не надо. она тебе и сама придет в MSDN есть пример, определяющий открытиые/закрытие сидюка с ее помощью
Че то ни фига не приходит Или я чего-то неправильно делаю: (заранее извиняюсь за дельфу) для того чтобы клавиатурный шпион работал нормально регистрю и создаю, но не показываю, невидимое окно и на сообщении о создании устанавливаю ловушку, на об уничтожении убираю, добавляю в case оконной процедуры WM_DEVICECHANGE Код (Text): WM_DEVICECHANGE: If ((wParam=$8000) or (wParam=$8004)) and (PDevBroadcastHdr(lparam)^.dbcd_devicetype=$2) then CDState:=not CDState; Где CDState - глобальная переменная, а тип PDevBroadcastHdr объявлен так Код (Text): type PDevBroadcastHdr = ^TDevBroadcastHdr; TDevBroadcastHdr = packed record dbcd_size: DWORD; dbcd_devicetype: DWORD; dbcd_reserved: DWORD; end; Уже потом на основании значения CDState вытаскиваю или закрываю CDRom, но беда в том, что CDState как был false так и остался, несмотря на выдвижение лотка Подскажите в чем может быть ошибка
код не смотрел. сразу встречный вопрос - ты курил MDSN? с какого напаса начал кодить? а) Windows 95 and Windows NT send all top-level windows a WM_DEVICECHANGE message when... б) WM_DEVICECHANGE ходит под WM_COMMAND. см. ниже Код (Text): LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM uParam, LPARAM lParam) { int wmId, wmEvent; switch (message) { case WM_COMMAND: wmId = LOWORD(uParam); wmEvent = HIWORD(uParam); switch (wmId) { case WM_DEVICECHANGE: /* твой код */ break; ....