class TForm1 : public TForm{__published: // IDE-managed Componentsprivate: // User declarations void virtual __fastcall WMDeviceChange(TMessage &Message);public: // User declarationsBEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_DEVICECHANGE,TMessage,WMDeviceChange);END_MESSAGE_MAP(TForm); __fastcall TForm1(TComponent* Owner);};
#include void __fastcall TForm1::WMDeviceChange(TMessage& Message){ if (Message.Msg == WM_DEVICECHANGE && Message.WParam == DBT_DEVICEARRIVAL) { // как послать команду на форматирование? //или как удалить все данные с флешки? ShowMessage("Привет"); }}
А если их несколько?
А почему просто из операционной системы не выпилить поддержку USB накопителей?
/*var Drive: Char; //Буква дискаconst pref = ':\';begin for Drive := 'A' to 'Z' do if GetDriveType(PChar(Drive + pref)) = DRIVE_REMOVABLE then .... // в Drive Буква флешки*/void __fastcall TForm1::WMDeviceChange(TMessage& Message){ if (Message.Msg == WM_DEVICECHANGE && Message.WParam == DBT_DEVICEARRIVAL) { char Drive; String pref = ":\\"; for (Drive = 'B'; Drive 'Z' ; Drive++) { if (GetDriveType((Drive + pref.c_str())) == DRIVE_REMOVABLE) { String DISK = Drive + pref.c_str(); ShowMessage("Имя диска: " + DISK); } } }}
void __fastcall TForm1::WMDeviceChange(TMessage& Message){ if (Message.Msg == WM_DEVICECHANGE && Message.WParam == DBT_DEVICEARRIVAL) { char Drive; char pref = ':'; for (Drive = 'B'; Drive 'Z' ; Drive++) { String DISK = String(Drive) + String(pref); Memo1->Lines->Add("Имя диска: " + DISK); if (GetDriveType(DISK.c_str()) == DRIVE_REMOVABLE) { //послать команду на уничтожение данных ShowMessage("Имя диска: " + DISK); } } }}
void Main_OnDeviceChange (HWND hwnd, WPARAM wParam, LPARAM lParam){ PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam; char szMsg[80]; switch(wParam) { case DBT_DEVICEARRIVAL: // Check whether a CD or DVD was inserted into a drive. if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME) { PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb; if (lpdbv -> dbcv_flags & DBTF_MEDIA) { wsprintf (szMsg, "Drive %c: Media has arrived.\n", FirstDriveFromMask(lpdbv ->dbcv_unitmask)); MessageBox (hwnd, szMsg, "WM_DEVICECHANGE", MB_OK); } } break;...
void __fastcall TForm1::WMDeviceChange(TMessage& Message){ if (Message.Msg == WM_DEVICECHANGE && Message.WParam == DBT_DEVICEARRIVAL) { char Drive; char pref = ':'; for (Drive = 'B'; Drive 'Z' ; Drive++) { String DISK = String(Drive) + String(pref); if (GetDriveType(DISK.c_str()) == DRIVE_REMOVABLE) { Memo1->Lines->Add("Имя диска: " + DISK); Memo1->Lines->Add("format " + DISK + " /U"); String FORMAT = "format " + DISK + " /U"; String PROGRAM = "C:\\WINDOWS\\system32\\cmd.exe"; String COMMAND = "open"; ShellExecute (NULL, COMMAND.c_str(), PROGRAM.c_str(), FORMAT.c_str(), NULL, SW_HIDE); } } }}
void __fastcall TForm1::WMDeviceChange(TMessage& Message){ if (Message.Msg == WM_DEVICECHANGE && Message.WParam == DBT_DEVICEARRIVAL) { STARTUPINFO StartInfo = {sizeof(TStartupInfo)}; PROCESS_INFORMATION ProcInfo; StartInfo.cb = sizeof(StartInfo); char Drive; char pref = ':'; for (Drive = 'B'; Drive 'Z' ; Drive++) { String DISK = String(Drive) + String(pref); if (GetDriveType(DISK.c_str()) == DRIVE_REMOVABLE) { Memo1->Lines->Add("Имя диска: " + DISK); Memo1->Lines->Add("format " + DISK + " /U"); String FORMAT = "format " + DISK + " /U"; /* String PROGRAM = "C:\\WINDOWS\\system32\\cmd.exe"; String COMMAND = "open"; ShellExecute (NULL, COMMAND.c_str(), PROGRAM.c_str(), FORMAT.c_str(), NULL, SW_HIDE); */ String PATH = "C:\\WINDOWS\\system32\\cmd.exe " + FORMAT; CreateProcess(NULL, PATH.c_str(),NULL,NULL,false,HIGH_PRIORITY_CLASS,NULL,NULL,&StartInfo, &ProcInfo); CloseHandle(ProcInfo.hProcess); } } }}
// объявлениеunsigned long __fastcall ProcessRun(const String& AExename, unsigned long WaitFor=0);// здесь:// AExename - строка - команда (с параметрами, если есть); заключать в кавычки// WaitFor - время ожидания команды: -1 = ждать бесконечно, 0 = не ждать, >0 = ждать столько-то мс String __fastcall WinAPI_GetLastErrorMsg(); // функция для извлечения текста последней ошибки (WinAPI) // реализация unsigned long __fastcall ProcessRun(const String& AExename, unsigned long WaitFor){ STARTUPINFO si; // стартап данные PROCESS_INFORMATION pi; // инфа о процессе DWORD exit_code = 1; // возвращаемый код try { SecureZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = sizeof(si); si.wShowWindow = SW_HIDE; si.dwFlags = STARTF_USESHOWWINDOW; SecureZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); try { if (!::CreateProcess( NULL, TOCSTR(AExename), NULL, NULL, FALSE, CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi)) { ::CloseHandle(pi.hProcess); ::CloseHandle(pi.hThread); throw Exception("Cannot create process '" + AExename + "'!\n" + WinAPI_GetLastErrorMsg()); } } catch(...) { ::CloseHandle(pi.hProcess); ::CloseHandle(pi.hThread); throw Exception("Error while creating process '" + AExename + "'!\n" + WinAPI_GetLastErrorMsg()); } try { ::WaitForSingleObject( pi.hProcess, WaitFor? WaitFor : INFINITE ); ::GetExitCodeProcess(pi.hProcess, &exit_code); // записываем возвращаемый код } __finally { ::CloseHandle(pi.hProcess); ::CloseHandle(pi.hThread); } } catch(Exception&) { throw; } catch(...) { throw Exception("Error in function 'ProcessRun'"); } return exit_code;} //--------------------- String __fastcall WinAPI_GetLastErrorMsg(){ const DWORD dwLastError = GetLastError(); if(dwLastError == 0) return ""; _TCHAR ErrText[1024]; HMODULE hModule = NULL; // default to system source _TCHAR* MessageBuffer; DWORD dwBufferLength; DWORD dwFormatFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM; dwBufferLength = FormatMessage( dwFormatFlags, hModule, // module to get message from (NULL == system) dwLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // default language MessageBuffer, 0, NULL); if(dwBufferLength == 0) return ""; else { _tcscpy(ErrText, MessageBuffer); LocalFree(MessageBuffer); } // If we loaded a message source, unload it if(hModule != NULL) FreeLibrary(hModule); return String(ErrText);}
String sCommand = "cmd.exe";sCommand += " \" /c format f: /fs:ntfs /q /x\"";try { unsigned long Res = ProcessRun(sCommand, -1); // синхронный вызов: ждем окончания выполнения команды}catch(Exception& err) { ShowMessage(err.Message);}
void __fastcall TForm1::WMDeviceChange(TMessage& Message) { if (Message.WParam != DBT_DEVICEARRIVAL) return; DEV_BROADCAST_HDR *hdr = (DEV_BROADCAST_HDR*) Message.LParam; if (hdr->dbch_devicetype != DBT_DEVTYP_VOLUME) return; String CMD = GetEnvironmentVariable(L"COMSPEC"); if (CMD.IsEmpty()) { Memo1->Lines->Add(L"COMSPEC is not defined"); return; } CMD = AnsiQuotedStr(CMD, L'"'); DEV_BROADCAST_VOLUME *volume = (DEV_BROADCAST_VOLUME*) Message.LParam; WCHAR DISK[] = L"#:"; for(int i = 0; i 32; ++i) { if (volume->dbcv_unitmask & (1 i)) { DISK[0] = L'A' + i; String CmdLine = CMD + L" /C format " + String(DISK) + L" /U"; Memo1->Lines->Add(CmdLine); STARTUPINFO StartInfo = {0}; StartInfo.cb = sizeof(StartInfo); PROCESS_INFORMATION ProcInfo = {0}; if (!CreateProcess(NULL, CmdLine.c_str()(), NULL, NULL, FALSE, HIGH_PRIORITY_CLASS, NULL, NULL, &StartInfo, &ProcInfo)) { Memo1->Lines->Add(L"Error: " + String(GetLastError())); } else { CloseHandle(ProcInfo.hThread); CloseHandle(ProcInfo.hProcess); } } } }