1 (изменено: Poltergeyst, 2009-08-14 18:08:24)

Тема: HTA/HTML: асинхронное отслеживание событий WMI

Обычная функция VBScript CreateObject используемая в пространстве HTA/HTML неспособна задействовать обработку событий неграфического ActiveX объекта, даже если объект поставляет соответствующий интерфейс. Чтобы выйти из ситуации, нет ничего проще, как создать неграфический ActiveX объект поставляющий события, в виде графического элемента с нулевыми размерными параметрами и обрабатывать его события через функции вида имя объекта_имя события. В предложенном HTA примере идет обработка событий объекта синхронизации WMI ISWbemSink (асинхронное отслеживание создания нового процесса).

sample.hta:

<HTML>
<HEAD>
    <meta http-equiv=Content-Type content="text/html; charset=windows-1251">
    <TITLE>
        Обработка событий объекта ISWbemSink в пространстве HTA/HTML
    </TITLE>
</HEAD>

<BODY SCROLL="YES">

    <OBJECT ID="ObjSink" 
        STYLE="position:absolute;top:0;left:0;width:0;height:0"
        CLASSID="CLSID:75718C9A-F029-11D1-A1AC-00C04FB6C223">
    </OBJECT>

    <SCRIPT LANGUAGE="VBScript">
    Set IObjService    =GetObject("winmgmts:\\.\Root\CIMV2")
    '---------------------------------------------------------------------------
    IObjService.ExecNotificationQueryAsync _
    ObjSink, _
    "SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA ""Win32_Process"""
    
    '/Обработка события/
    '---------------------------------------------------------------------------
    Function ObjSink_OnObjectReady(objWbemObject, ISWbemNamedValueSet)
        MsgBox objWbemObject.GetObjectText_,vbExclamation+vbSystemModal,"Обработка событий"
    End Function
    '---------------------------------------------------------------------------
    Function window_onunload()
        ObjSink.Cancel()
    End Function
    '---------------------------------------------------------------------------
    Function window_onload()
        MsgBox "Запустите какой-нибудь процесс...",vbExclamation+vbSystemModal,"Обработка событий"
    End Function
    '---------------------------------------------------------------------------
    </SCRIPT>
</BODY>
</HTML>

2 (изменено: Poltergeyst, 2009-08-13 22:09:32)

Re: HTA/HTML: асинхронное отслеживание событий WMI

В случае обработки события объекта синхронизации WMI в пространстве HTML документа удобно использовать объект WbemLocator (для Internet Explorer).
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Перед запуском разрешите обработку ActiveX объектов на HTML страницах Internet Explorer примерно по следующей схеме: [Панель управления] - [Свойства Обозревателя] - [Безопасность] - [Зона "Интернет"] - [Уровень безопасности для этой зоны] - [кнопка "Другой"]. В появившемся диалоге разрешите все что связано с элементами ActiveX и примените изменения. Это обеспечит корректную работу.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Файл EvtAsync.htm запускается в Internet Explorer:

<HTML>
<HEAD>
    <meta http-equiv=Content-Type content="text/html; charset=windows-1251">
    <TITLE>
        Обработка событий объекта ISWbemSink в пространстве HTML
    </TITLE>
</HEAD>

<BODY SCROLL="YES">

    <OBJECT ID="ObjSink"
        STYLE="position:absolute;top:0;left:0;width:0;height:0"
        CLASSID="CLSID:75718C9A-F029-11D1-A1AC-00C04FB6C223">
    </OBJECT>

    <OBJECT ID="ISWbemLocator"
        STYLE="position:absolute;top:0;left:0;width:0;height:0"
        CLASSID="CLSID:76A64158-CB41-11D1-8B02-00600806D9B6">
    </OBJECT>

    <SCRIPT LANGUAGE="VBScript">

    '//--------------Отслеживание запуска нового процесса---------------------//
    
    Set IObjService = ISWbemLocator.ConnectServer(".","Root\CIMV2")
    '---------------------------------------------------------------------------
    IObjService.ExecNotificationQueryAsync _
    ObjSink, _
    "SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA ""Win32_Process"""
    
    '/Обработка события/
    '---------------------------------------------------------------------------
    Function ObjSink_OnObjectReady(objWbemObject, ISWbemNamedValueSet)
        MsgBox objWbemObject.GetObjectText_,vbExclamation Or vbSystemModal,"Обработка событий"
    End Function
    '---------------------------------------------------------------------------
    Function window_onunload()
        ObjSink.Cancel()
    End Function
    '---------------------------------------------------------------------------
    Function window_onload()
        MsgBox "Запустите какой-нибудь процесс...",vbExclamation Or vbSystemModal,"Обработка событий"
    End Function
    '---------------------------------------------------------------------------
    </SCRIPT>
</BODY>
</HTML>