我需要检测Windows服务中的可移动媒体插入。使用不可见的窗口,我可以使用RegisterDeviceNotification
成功检测到USB拇指驱动器,但SD卡证明更加困难。我发现使用SHChangeNotifyRegister
的代码,但经过进一步调查,我只能从窗口应用程序中获取它。
(代码找到代码项目:http://www.codeproject.com/Articles/3946/Trapping-windows-messages?msg=2897423#xx2897423xx)
namespace globals{
SHChangeNotifyEntry shcne[1];
}
...
globals::shcne[0].pidl = NULL;
globals::shcne[0].fRecursive = TRUE;
globals::hNotify = SHChangeNotifyRegister(globals::hwnd, SHCNE_DISKEVENTS,
SHCNE_MEDIAINSERTED | SHCNE_MEDIAREMOVED,
WM_MEDIA_CHANGE, 1, globals::shcne);
我收到的错误是
122(ERROR_INSUFFICIENT_BUFFER - “传递给系统的数据区域 电话太小了。“)
尽管调用相同,但我的Win32窗口应用程序测试程序中不会发生此错误。
编辑:我已通过使用SERVICE_INTERACTIVE_PROCESS
标志注册服务来解决错误消息(某种类型),但我仍然没有在我的WndProc中接收消息。
我非常感谢任何帮助。
答案 0 :(得分:1)
即使我在这里复活旧线程:
只需将RegisterDeviceNotification
与DEVICE_NOTIFY_SERVICE_HANDLE
一起使用,您(当然)必须通过ControlHandler注册您需要服务名称的RegisterServiceCtrlHandlerEx - 并且不要忘记在您启动服务之前需要注册此句柄(也提到@ MSDN)。您可以安全地将函数指针强制转换为LPHANDLER_FUNCTION_EX
,只要您的函数签名与MSDN示例匹配,这些强制转换通常是安全的。
最后,您现在可以使用GUID_DEVINTERFACE_SMARTCARD_READER
作为RegisterDeviceNotification
您的回调必须有此签名:http://msdn.microsoft.com/en-us/library/windows/desktop/ms683241(v=vs.85).aspx