主要通過registerdevicenotification函式來完成,網上一般能找到都是window程式,很少缺少服務程式的例子。
2.svcmain 函式中
dev_broadcast_deviceinte***ce
dev_broadcast_deviceinte***ce = ;
dev_broadcast_deviceinte***ce.dbcc_size = sizeof(dev_broadcast_deviceinte***ce);
dev_broadcast_deviceinte***ce.dbcc_devicetype = dbt_devtyp_deviceinte***ce;
//dev_broadcast_deviceinte***ce.dbcc_name= null;
dev_broadcast_deviceinte***ce.dbcc_reserved = 0;
dev_broadcast_deviceinte***ce.dbcc_classguid = guid_devinte***ce_net;
hdevnotify = registerdevicenotification(sshstatushandle, &dev_broadcast_deviceinte***ce,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
從這裡可以知道lpeventdata型別windows訊息的lparam引數,dwcontrols是具體的型別,根據型別來設定結構體指標就可以正常處理了。
如何在Fragment中監聽觸控事件
大家都知道,我們的activity中有ontouchevent方法,可以用來實現觸控事件的監聽。activity的觸控事件 override public boolean ontouchevent motionevent event 但是對於fragment,其中卻沒有這個方法,如果我們在fragm...
如何在Revit中監聽鍵盤事件
小夥伴們在做revit二次開發的時候,可能會需要在自己做的外掛程式執行時,去監聽某個按鍵然後做出相應的反應。比如在生成乙個很大的模型時,發現不對勁,想停止程式執行,這個時候就可以通過監聽按鍵事件去取消這個正在執行的程式,或者通過監聽按鍵事件去觸發特定事件。為了實現全域性監聽,這裡使用了hook技術,...
如何在Canvas中新增事件?
作為乙個前端,給元素新增事件是一件司空見慣的事情。可是在canvas中,其所畫的任何東西都是無法獲取的,更別說新增事件,那麼我們對其就束手無策了嗎?當然不是的!我們在平時專案中肯定都用過許多canvas的框架,我們發現事件在這些框架中已經使用的十分成熟了,而且並沒有出現特別嚴重的問題。那麼我們可以肯...