Регистр-ObjectEvent ищет экземпляр объекта в обязательном параметре InputObject. Каков синтаксис для статического события (Shared) объекта?
ОБНОВЛЕНИЕ: Правильный синтаксис для TimeChanged:
$systemEvents = [Microsoft.Win32.SystemEvents]
$timeChanged = Register-ObjectEvent -InputObject $systemEvents
-EventName 'TimeChanged' -Action { Write-Host "Time changed" }
К сожалению, SystemEvents не будет сообщен в PowerShell ISE. Вот образец с помощью staic события объекта, которое работает везде:
$networkInformation = [System.Net.NetworkInformation.NetworkChange];
$networkAddressChanged = Register-ObjectEvent -InputObject $networkInformation
-EventName 'NetworkAddressChanged'
-Action { Write-Host "NetworkAddressChanged event signaled" }
Если вы назначаете статический тип переменной, вы можете подписаться на статические события.
Например:
$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
EDIT: Я заметил при попытке доступа События [Microsoft.Win32.SystemEvents], которые мне нужно было запускать в приглашении с повышенными привилегиями (в Vista и более поздних версиях), чтобы получить доступ к сообщениям.
Стивен дал правильный ответ, поэтому не нужно голосовать по этому вопросу (проголосуйте за него). Я просто хотел опубликовать пример фрагмента, который люди могут использовать для игры со статическими событиями, чтобы вам не пришлось искать статическое событие 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