2

我需要检测来自 Windows 服务的可移动媒体插入。使用不可见的窗口,我可以成功检测带有 的 USB 拇指驱动器RegisterDeviceNotification,但事实证明 SD 卡更加困难。我找到了使用 的代码SHChangeNotifyRegister,但经过进一步调查,我只能从窗口应用程序中让它工作。

(从 codeproject 找到的代码: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 中收到消息。

我将不胜感激任何帮助。

4

1 回答 1

1

即使我在这里复活旧线程:

只需使用RegisterDeviceNotificationwith DEVICE_NOTIFY_SERVICE_HANDLE,您(当然)必须通过RegisterServiceCtrlHandlerEx 注册您的ControlHandler,其中您需要您的 serviceName -并且不要忘记在启动服务之前需要注册此句柄(也提到@MSDN)。您可以安全地将函数指针转换为 ,只要您的函数签名与 MSDN 示例匹配,这些转换通常是安全的。LPHANDLER_FUNCTION_EX

最后,您现在可以GUID_DEVINTERFACE_SMARTCARD_READER用作参数RegisterDeviceNotification

您的回调必须具有此签名: http: //msdn.microsoft.com/en-us/library/windows/desktop/ms683241 (v=vs.85).aspx

于 2014-08-11T14:16:28.763 回答