Каков синтаксис подписки на статическое событие объекта в PowerShell?


person George Tsiokos    schedule 25.02.2010    source источник
comment
В PowerShell работает цикл обработки сообщений, но для доступа к нему необходимо запустить его от имени администратора.   -  person Steven Murawski    schedule 02.03.2010


Ответы (2)


Если вы присваиваете переменной статический тип, вы можете подписаться на статические события.

Например:

$MyStaticType = [MyStaticNamespace.MyStaticClass]
Register-ObjectEvent -InputObject $MyStaticType -EventName MyStaticEvent -Action {Write-Host "Caught a static event"}

Чтобы найти любые статические события, которые может иметь тип, вы можете использовать Get-Member с переключателем -Static.

[MyStaticNamespace.MyStaticClass] | get-member -static -membertype event

РЕДАКТИРОВАТЬ: при попытке доступа к событиям [Microsoft.Win32.SystemEvents] я заметил, что для доступа к сообщениям мне нужно запускать приглашение с повышенными привилегиями (в Vista и выше).

person Steven Murawski    schedule 01.03.2010

У Стивена есть правильный ответ, так что не нужно голосовать за него (вместо этого проголосуйте за него). Я просто хотел опубликовать пример фрагмента, который люди могут использовать для игры со статическими событиями, чтобы вам не нужно было искать статическое событие BCL, которое легко запустить. :-)

$src = @'
using System;

namespace Utils {
public static class StaticEventTest 
{
    public static event EventHandler Fired;

    public static void RaiseFired()
    {
        if (Fired != null) 
        { 
            Fired(typeof(StaticEventTest), EventArgs.Empty); 
        }
    }
}}
'@

$srcId = 'Fired'

Add-Type -TypeDefinition $src

Unregister-Event -SourceIdentifier $srcId -ea 0

$id = Register-ObjectEvent ([Utils.StaticEventTest]) Fired `
          -SourceIdentifier $srcId -Action {"The static event fired"}

[Utils.StaticEventTest]::RaiseFired()

while (!$id.HasMoreData) { Start-Sleep -Milliseconds 250 }

Receive-Job $id
person Keith Hill    schedule 02.03.2010
comment
Спасибо за это. Я позволил себе позаимствовать большую часть фрагмента своего вопроса здесь. - person dxiv; 17.04.2020