7

Register-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" }
4

2 回答 2

9

如果将静态类型分配给变量,则可以订阅静态事件。

例如:

$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 及更高版本上)才能访问消息。

于 2010-03-01T22:26:27.500 回答
3

史蒂文得到了正确的答案,因此无需对此投票(改为投票给他)。我只是想发布一个示例片段,人们可以使用它来玩弄静态事件,这样您就不必找到易于触发的 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
于 2010-03-02T01:11:28.490 回答