I found a solution, thanks to http://www.haogongju.net/art/1480814 It would be nice to be able to attach some files, but it looks like it needs to be built in.
SystemEvents.h
#ifndef SystemEventsH #define SystemEventsH #include <System.Classes.hpp> #include <FMX.Controls.hpp> #include <FMX.Forms.hpp> #include "DeviceChanged.h" //--------------------------------------------------------------------------- class TSystemEvents : TObject { private: TDeviceChangedMethod pDeviceChangeHandler; TForm *pOwnerForm; #ifdef _Windows HWND Hwnd; // Save the window handle LONG OldWndProc;// And remember the old WndProc so we can put it back later #endif public: __fastcall TSystemEvents(TForm *_pForm); __fastcall ~TSystemEvents(); __property TForm *OwnerForm = {read=pOwnerForm}; #ifdef _Windows LRESULT __stdcall MessageHandler(Winapi::Messages::TMessage &Message); #endif // _Windows __property TDeviceChangedMethod DeviceChangeHandler={read=pDeviceChangeHandler,write=pDeviceChangeHandler}; }; extern TSystemEvents *SystemEvents; #endif
SystemEvents.cpp
#include <fmx.h>
DeviceChanged.h
#ifndef DeviceChangedH #define DeviceChangedH
DeviceChanged.cpp
#include <fmx.h> #include <Dbt.h> #pragma hdrstop #include "DeviceChanged.h" //--------------------------------------------------------------------------- #pragma package(smart_init) DeviceChangedParam __fastcall TDeviceChangedMessage::ParamForWin32wParam(WPARAM _wParam) { if (_wParam == DBT_DEVNODES_CHANGED) return DeviceChangedParam::DeviceNodesChanged; return DeviceChangedParam::Unknown; }
To use it:
#include <SystemEvents.h> TSystemEvents *SystemEvents; // In Constructor: { SystemEvents = new TSystemEvents(this); SystemEvents->DeviceChangeHandler = OnDeviceChanged; } // In Destructor: { deletenullify(SystemEvents); } // Handler: void __fastcall TMainForm::OnDeviceChanged(System::TObject* Sender, TDeviceChangedMessage *M) { if (M->Param == DeviceChangedParam::DeviceNodesChanged) { OnUSBDeviceChanged(); } }
Works for me. :)
source share