Пишу приложение, которое отслеживает подключаемые флешки в компьютер. Использую WinApi'шную библиотеку User32.dll для регистрации эвентов.
Сейчас имееется такая заготовка:
public class Win32
{
...
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr RegisterDeviceNotification(IntPtr IntPtr, IntPtr NotificationFilter, Int32 Flags);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern uint UnregisterDeviceNotification(IntPtr hHandle);
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string className, string lpWindowName);
...
}
private static void RegisterDeviceNotification()
{
Win32.ServiceControlHandlerEx myCallback = new Win32.ServiceControlHandlerEx(ServiceControlHandler);
Win32.RegisterServiceCtrlHandlerEx(Process.GetCurrentProcess().ProcessName, myCallback, IntPtr.Zero);
var serviceHandler = FindWindow(null, Console.Title);
// serviceHandler = Process.GetCurrentProcess().Handle;
// serviceHandler = Process.GetCurrentProcess().MainWindowHandle;
if (serviceHandler == IntPtr.Zero)
{
throw new Exception();
}
Win32.DEV_BROADCAST_DEVICEINTERFACE deviceInterface = new Win32.DEV_BROADCAST_DEVICEINTERFACE();
int size = Marshal.SizeOf(deviceInterface);
deviceInterface.dbcc_size = size;
deviceInterface.dbcc_devicetype = Win32.DBT_DEVTYP_DEVICEINTERFACE;
IntPtr buffer = default(IntPtr);
buffer = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(deviceInterface, buffer, true);
deviceEventHandle = Win32.RegisterDeviceNotification(serviceHandler, buffer,
Win32.DEVICE_NOTIFY_SERVICE_HANDLE |
Win32.DEVICE_NOTIFY_ALL_INTERFACE_CLASSES);
if (deviceEventHandle == IntPtr.Zero)
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
}
GetLastWin32Error выдают ошибку - The handle is invalid. В чем моя ошибка? И как правильно нужно получить handle консольного приложения?