如何在服務程式中監聽硬體事件

2021-07-14 19:30:09 字數 2601 閱讀 2869

主要通過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的框架,我們發現事件在這些框架中已經使用的十分成熟了,而且並沒有出現特別嚴重的問題。那麼我們可以肯...