如何在服务程序中监听硬件事件
来源:互联网 发布:一元淘宝 编辑:程序博客网 时间:2024/05/19 02:04
主要通过RegisterDeviceNotification函数来完成,网上一般能找到都是window程序,很少缺少服务程序的例子。
1. 从网上下载一个服务程序的框架。
2.svcmain 函数中
DEV_BROADCAST_DEVICEINTERFACE dev_broadcast_deviceinterface = {0};
dev_broadcast_deviceinterface.dbcc_size =sizeof(dev_broadcast_deviceinterface);
dev_broadcast_deviceinterface.dbcc_devicetype =DBT_DEVTYP_DEVICEINTERFACE;
//dev_broadcast_deviceinterface.dbcc_name= NULL;
dev_broadcast_deviceinterface.dbcc_reserved = 0;
dev_broadcast_deviceinterface.dbcc_classguid =GUID_DEVINTERFACE_NET;
hDevNotify = RegisterDeviceNotification(sshStatusHandle, &dev_broadcast_deviceinterface,DEVICE_NOTIFY_SERVICE_HANDLE);
if(NULL==hDevNotify)
{
//error handler
}
注意这里的变量是sshStatusHandle,类型是DEVICE_NOTIFY_SERVICE_HANDLE
SERVICE_STATUS_HANDLE sshStatusHandle;
sshStatusHandle = RegisterServiceCtrlHandlerEx(pService, (LPHANDLER_FUNCTION_EX)svc_ctrl,NULL);
窗口程序用的是窗口的句柄,服务程序这里用的是SERVICE_STATUS_HANDLE类型,具体就是从RegisterServiceCtrlHandlerEx函数的返回值。
要收到DEVICEEVENT消息需要使用RegisterServiceCtrlHandlerEx,而不是RegisterServiceCtrlHandler
switch(dwCtrlCode)
{
case SERVICE_CONTROL_STOP:
case SERVICE_CONTROL_SHUTDOWN:
ssStatus.dwWin32ExitCode = 0;
ssStatus.dwCurrentState =SERVICE_STOP_PENDING;
ssStatus.dwCheckPoint = 0;
ssStatus.dwWaitHint = 0;
SetServiceStatus(sshStatusHandle, &ssStatus);
// terminate all processesstarted by this service before shutdown
SetEvent(ghRegStopEvent);
SetEvent(ghSvcStopEvent);
break;
case SERVICE_CONTROL_PAUSE:
ssStatus.dwCurrentState =SERVICE_PAUSED;
svc_stop(0);
break;
case SERVICE_CONTROL_CONTINUE:
ssStatus.dwCurrentState =SERVICE_RUNNING;
svc_stop(1);
break;
case SERVICE_CONTROL_INTERROGATE:
break;
case SERVICE_CONTROL_DEVICEEVENT:
//我们关注的消息
OutputDebugStringA("hello world"
break;
default:
break;
If dwControlis SERVICE_CONTROL_DEVICEEVENT, this parameter can beone of the following values:
· DBT_DEVICEARRIVAL
· DBT_DEVICEREMOVECOMPLETE
· DBT_DEVICEQUERYREMOVE
· DBT_DEVICEQUERYREMOVEFAILED
· DBT_DEVICEREMOVEPENDING
· DBT_CUSTOMEVENT
· lpEventData
· Additional device information, ifrequired. The format of this data depends on the value of thedwControland dwEventType parameters. If dwEventType isSERVICE_CONTROL_DEVICEEVENT, this data corresponds to thelParamparameter that applications receive as part of a WM_DEVICECHANGEmessage. IfdwEventType is SERVICE_CONTROL_POWEREVENT, this data is apointer to a POWERBROADCAST_SETTING structure. If dwEventType isSERVICE_CONTROL_SESSIONCHANGE, this parameter is a pointer to aWTSSESSION_NOTIFICATIONstructure.
从这里可以知道lpEventData类型windows消息的lParam参数,dwControls是具体的类型,根据类型来设置结构体指针就可以正常处理了。
- 如何在服务程序中监听硬件事件
- 如何在Fragment中监听触摸事件
- 如何在Fragment中监听触摸事件
- 如何在VC代码中监听ArcEngine的COM事件
- 如何在phonegap中监听数据加载的事件
- 如何在ArcMap中监听键盘鼠标事件
- 如何在service中获取按键监听事件呢
- 按钮的监听事件在fragment中如何实现
- Android如何在Fragment中监听OnKeyDown、OnkeyUp事件
- 如何解决在服务中处理activity中的事件
- 在SWT中,如何点击一个按钮跳转到另外一个窗口?监听事件如何编写?
- 关于OracleOraDb11g_home1TNSListener监听程序在windows服务列表中消失问题
- 在全局中监听键盘事件
- 在AS中动态监听控件事件
- 在 JavaScript 中监听 IME 键盘输入事件
- 在as中监听自定义事件
- 在videoview中增加点击监听事件
- 如何在服务(Service)程序中显示对话框
- linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )
- 软件测试总结
- 关于armv7,armv7s,arm64,i386,x86_64的理解
- C语言入门(十四)变量的作用域和存储类型
- Android上传文件到Web服务器,PHP接收文件(二)
- 如何在服务程序中监听硬件事件
- AFNetworking2使用自签证书
- BZOJ 1085 骑士精神 DFS+A*
- 使用axis2进行WebService的开发
- MAC操作系统下得mamp pro添加扩展
- Android学习笔记46:使用Post方式提交数据
- winrar5.31 专用激活key
- oscache缓存配置
- 16.7.12