对于系统级的事件,不得由App直接发送。所有事件的投递,当应用不在运行时,都会加载应用并执行。
IShell_SendEvent进行同步,阻塞的事件投递,目标应用由CLSID 参数决定。该函数内部会直接调用目标应用的HandleEvent。函数的返回值表征该事件是否被Consume(处理,并Return TRUE)了。当使用该函数投递指针(包括接口)时,接收方必须对其负责(Copy Buffer,对接口引用计数加1)。
IShell_PostEvent:进行异步,非阻塞的方式投递事件,其他行为和IShell_SendEvent一致。由于是异步方式,其返回值仅表征事件是否已经Schedule了,而并非是否处理了。该接口应尽量避免投递指针或者接口。
IShell_PostEventEx:和IShell_PostEvent一致,唯一的区别为,前者不能Schedule重复的同一类型的事件,而后者可以。
IShell_HandleEvent:行为和IShell_SendEvent类似,区别是不需要指定目标应用的CLSID,默认投递到Top Visable的App,鉴于此,该函数通常被用于接口向应用投递事件,比如IMenuCtl投递EVT_Command
IShell_SendURL:运行时动态的决定目标App,将URL视为MIME Type,BREW查询出Handler后,投递EVT_APP_Send_URL给该App。投递是同步阻塞的。URL会被BREW进行Copy,所以是安全的。
IShell_PostURL:和IShell_SendURL类似,区别是异步的投递,事件为EVT_APP_POST_URL
使用IShell_SendURL,IShell_PostURL的优点是,应用间解耦,利用MIME Register/Get Handler机制动态获取终端CLSID并投递,数据的投递是安全的,如果想投递任意复杂度的数据,可以将其进行BASE64编码成纯ASCII数据再投递。