Контролирани от делфините флаш устройства

Вече няколко пъти посетителите на нашия уебсайт се свързаха с мен по пощата с молба да обяснят: „Как можете да установите факта, когато флаш устройство е поставено в компютър?“ Обикновено в отговор изпращах кандидата (не, не къде може да мислите?) До MSDN. Факт е, че никога преди не съм се сблъсквал с такава задача, т.е. нямаше реална практика. И в негово отсъствие рядко се задължавам да пиша цели източници по пощата. По-добре отделете време и напишете малка статия и достигнете до голяма аудитория, отколкото безкрайно да препращате имейл с отговор.

Започнах да пиша статията. Приложих алгоритъма за определяне на инсталирането на флаш устройство с помощта на специален клас DriveDetector. Този клас е удоволствие да се използва. Проблемът е, че класът е изцяло за .NET езици, което означава, че добрият стар Delphi пуши настрана. Не можах да се съглася с такава несправедливост, затова реших да не разбирам всички тънкости на този клас на sicharp и да направя нещо подобно за Delphi.

Windows API е главата

Без дори да имам време да разгледам изходния код на класа DriveDetector, знаех, че той се основава на нищо повече от банално извикване на съответните функции на WinAPI. Без да се двоумя нито за секунда, аз впрегнах лисицата на огъня и отпътувах към вълшебната долина на MSDN. Това свещено място има невероятна книга, описваща всички тайни на славното царство на Windows. Когато стигнах там, дадох на локалната търсачка няколко ключови думи и няколко секунди по-късно ми донесе красиво проектиран свитък с резултати от търсенето. Буквално първият запис в това писание беше точно това, което беше необходимо за решаване на проблема ми.

Четене на свещени писания

След като прочетох малко намерените страници, разбрах, че за да открия момента на свързване на ново оборудване (било то флаш устройство или нещо друго), трябва да приложа обработката на съобщението WM_DEVICECHANGE. Ако работите с Delphi от няколко дни, тогава вече трябва да знаете за реда на обработка на произволни съобщения на Windows, а ако не, тогава не потрепвайте и четете.

Отидете в частния раздел на вашия клас на формуляр и декларирайте нова процедура:

Процедура WindowProc (var Msg: TMessage); съобщение WM_DEVICECHANGE; stdcall;

Тази процедура ще се извиква всеки път, когато основният прозорец на нашето приложение получи съобщение WM_DEVICECHANGE.

Сега натиснете три вълшебни бутона - GTRL + SHIFT + C и делфинът любезно ще създаде празен шаблон за процедура за вас:

Опитайте да се обадите на обикновено диалогово съобщение. Например:

ShowMessage ('Намерен е нов хардуер');

Стартирайте програмата и опитайте да поставите флаш устройството. Ако звездите са добре разположени, ще видите съобщението си веднага след поставянето на диска. Готино? И най-важното, просто и бързо! Но както винаги, имаше няколко "НО". Не затваряйте приложението и се опитвайте да извадите флашката. В рамките на няколко секунди нашата програма отново ще покаже нашето съобщение. Само този път е подвеждащо, което е от полза. Защо се случва това? Виждате ли, съобщението WM_DEVICECHANGE се изпраща не само когато бъде открит нов хардуер, но и когато състоянието на свързаните устройства се промени. Например, когато изключите USB принтер, приложението ви също ще получи съобщение за промяна в състоянието на устройствата. Как тогава да бъдеш? Не се отчайвай! В магическата долина има отговор на този въпрос. Затворете нашето сурово приложение и се върнете към кода.