2020-12-29

[译]from https://docs.microsoft.com/en-us/windows/win32/shell/how-to-register-a-handler-for-a-device-event

如何为设备事件注册Handler

 

  • Handlers 定义了 AutoPlay 的软件部分. 他们软件图标和名字, 同时还有COM组件用来初始化以用来响应事件. 每一个Handler 对于特定的事件都写一个注册表在  EventHandler key下. 当事件到了就会调用.

Instructions

Handlers 和他们关联的事件定义在 AutoplayHandlers\Handlers 下. 子键不通,取决于系共同是否能直接读取设备或者设备提供内容通过合理的接口.

下面的例子展示一个设备的Handler 像mp3播放器那样,我们叫他MyHandler.他提供了内容对系统,通过专有的接口

HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER
   SOFTWARE
      Microsoft
         Windows
            CurrentVersion
               Explorer
                  AutoplayHandlers
                     Handlers
                        MyHandler
                           Action [REG_SZ] = Play music
                           CLSID [REG_SZ] = {a51f2ed3-634e-4a97-9d55-efcf08e7b32f}
                           DefaultIcon [REG_EXPAND_SZ] = %ProgramFiles%\Windows Media Player\wmplayer.exe,0
                           InitCmdLine [REG_SZ] = /Play
                           ProgID [REG_SZ] = WMP.PlayMusicFiles
                           Provider [REG_SZ] = Windows Media Player

虽然例子中有 ProgID 和 CLSID value, 他们是不相容的. 推荐 ProgID . 无论哪一个都应该指向一个 COM 组件来实现 IHWEventHandler 接口.

 

Action值可以是字面的值如 "Play music" 也可以是文件的资源字符串如 @%systemroot%\System32\wiaacmgr.exe,-276 这样. Provider也是一样的. 自动播放时 会将他们组合展示 比如例子的这个会展示成 "Play music using Windows Media Player."

DefaultIcon 是图标  .ico 文件或者二进制资源文件后面那个数就是icon在文件中资源的序号 ,如果是负数是资源ID建议用负数. 

InitCmdLine 直接传递给IHWEventHandler::Initialize 在其他的方法调用前.

 

下面的例子再次展示如CD-ROM 以及其他可移动磁盘.

HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER
   SOFTWARE
      Microsoft
         Windows
            CurrentVersion
               Explorer
                  AutoplayHandlers
                     Handlers
                        MyHandler
                           Action [REG_SZ] = @%systemroot%\System32\wiaacmgr.exe,-276
                           DefaultIcon [REG_EXPAND_SZ] = %systemroot%\System32\wiaacmgr.exe,-2
                           InvokeProgID [REG_SZ] = WIA.AutoPlayDropHandler
                           InvokeVerb [REG_SZ] = open
                           Provider [REG_SZ] = @%systemroot%\System32\wiaacmgr.exe,-101

 

InvokeProgID 和 InvokeVerb 替换了 CLSID, InitCmdLine, 和 ProgID.

InvokeProgID  和 InvokeVerb  匹配 HKEY_CLASSES_ROOT下的  键名字 . 如下.

 

HKEY_CLASSES_ROOT
   WIA.AutoplayDropHandler
      shell
         open
            DropTarget
               Clsid = {F1ABE2B5-C073-4dba-B6EB-FD7A5111DD8F}

 CoCreateInstance 会用这个CLSID 实现应用程序.

用以上2种方法定义后, 还需要注册一个特定的事件. 通过提供一个在 EventHandlers下的 注册表注意名字要一致.

下面是例子,展示如何注册一个GenericVolumeArrival 事件

 

HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER
   SOFTWARE
      Microsoft
         Windows
            CurrentVersion
               Explorer
                  AutoplayHandlers
                     EventHandlers
                        GenericVolumeArrival
                           MyHandler [REG_SZ]

IHWEventHandler

CoCreateInstance

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值