Outlook Watcher

Może i będę nudny, ale zaprezentuję jeszcze jeden przykład przechwytywania zdarzeń. Tym razem nie systemowych, ale konkretnej aplikacji, a mam tu na myśli Outlooka 2010. Zadaniem skryptu będzie wykonywanie prostego zadania w momencie odebrania wiadomości email, czyli coś na zasadzie pracy z regułami. Choć czytając miedzy wierszami chcę zaprezentować jak można przechwytywać zdarzenia z praktycznie dowolnej aplikacji, którą można zarządzać z poziomy PowerShell’a.

No dobrze, cała zabawa zaczyna się od utworzenia instancji obiektu aplikacji Outlook w celu wyciągnięcia z niej pewnych informacji oraz późniejszego wykorzystania obiektu podczas rejestracji zdarzenia obiektu.

$Outlook = New-Object -ComObject Outlook.Application

Jeżeli nie znamy dobrze budowy aplikacji to dzięki cmdletowi Get-Member możemy podejrzeć dany obiekt wyszukując interesujące nas zdarzenia (Event).

$Outlook | Get-Member -MemberType Event

Jak widzimy obiekt Outlook.Application posiada zdarzenie NewMailEx. Jednakże zanim zarejestrujemy nasłuchiwanie tego zdarzenia, zdefiniujmy sobie nasz blok kodu jaki będzie wykonywany w momencie jego wystąpienia. Dla celów prezentacji będzie to np. wyświetlenie powiadomienia koło zegara wraz z prostymi informacjami o wiadomości.

$Action = {…}

Zanim do tego przejdziemy trzeba by omówić jakie mamy tutaj możliwości, mianowicie jakie informacje są zwracane przez obiekt podczas wystąpienia zdarzenia. Jest to kilka „automatycznych zmiennych”, o których więcej możemy dowiedzieć się z dokumentacji.

Get-Help about_Automatic_Variables

W telegraficznym skrócie są to:
• $Args – argumenty zwracane przez obiekt w wstąpionym zdarzeniu
• $Event –zmienna zawierająca informacje o instancji zdarzenia
• $EventArgs – argumenty zwracane przez zdarzenie
• $EventSubscriber – zmienna zawierająca obiekt subskrybenta zdarzenia
• $Sender – zmienna zawierająca obiekt, który wygenerował zdarzenie

Najbardziej interesujące dla nas będą $Sender – czyli stan instancji obiektu w momencie wystąpienie zdarzenia oraz $Event – czyli właściwości samego zdarzenia.

W celu wydobycia informacji o nowej wiadomości wykorzystujemy obiekt, który wygenerował zdarzenie. Dzięki niemu możemy podpiąć się do odpowiedniego kontenera z danymi, w naszym przypadku jest to 6 czyli „Skrzynka Odbiorcza” – więcej na ten temat można znaleźć tutaj.  Następnie dzięki argumentom przesłanym podczas wystąpienia zdarzenia możemy odnaleźć odpowiednią wiadomość przy wykorzystaniu jej identyfikatora. Ostatecznie pobieramy interesujące nas informacje i zapisujemy je do zmiennej. Zakres pobranych informacji jak i forma ich prezentacji zależy tutaj tylko od naszych potrzeb i wyobraźni.

$Folder = $Sender.Session.GetDefaultFolder(6)
$Item = $Folder.Session.GetItemFromID($Event.SourceArgs)

$BalloonTipText = "Od: $($Item.SenderName)", "Do: $($Item.To)", "Temat: $($Item.Subject)" -join "`n"

Drugim krokiem jest stworzenie obiektu powiadomienia czyli tzw. „dymka” z wcześniej pobranymi danymi. Do tego celu ładujemy odpowiednie biblioteki i tworzymy obiekt System.Windows.Forms.NotifyIcon. Ustawiamy odpowiednie parametry typu ikona na pasku, rodzaj, tekst nagłówka czy tekst z naszymi informacjami.

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$NotifyIcon = New-Object System.Windows.Forms.NotifyIcon
$NotifyIcon.Icon = "C:\Windows\System32\PerfCenterCpl.ico"
$NotifyIcon.BalloonTipIcon = "Info"
$NotifyIcon.BalloonTipText = $BalloonTipText
$NotifyIcon.BalloonTipTitle = "Outlook"
$NotifyIcon.Visible = $True

Wywołanie powiadomienia odbywa się poprzez wykorzystanie metody ShowBalloonTip wraz z określeniem czasu jak długo ma być on widoczny podawanym w milisekundach.

$NotifyIcon.ShowBalloonTip(20000)

Jednakże w czasie pracy skryptu w momencie występowania kolejnych zdarzeń będą tworzone kolejne instancje obiektu NotifyIcon, dlatego mamy dobrą okazję, aby znów poćwiczyć przechwytywanie kolejnych zdarzeń. Mam tutaj na myśli przechwycenie zdarzenia zamknięcia powiadomienia, tak aby usuwało ono wcześniej utworzony obiekt.

Przy tak małym kodzie nie ma sensu zamykać go w osobnej zmiennej, dlatego od razu przejdę do rejestracji tego zdarzenia. Wewnątrz bloku kodu parametru Action użyje jedynie metody Dispose na obiekcie NotifyIcon w celu zwolnienia wcześniej zarezerwowanych zasobów oraz wyrejestruję nasłuchiwanie samego zdarzenia.

Register-ObjectEvent $NotifyIcon BalloonTipClosed -SourceIdentifier MyBalloonTipClosed -Action {
	$Sender.Dispose()
	Unregister-Event -SourceIdentifier $Event.SourceIdentifier -Force
}

Ostatecznie rejestrujemy zdarzenie odebrania nowej wiadomości .

Register-ObjectEvent $Outlook NewMailEx -SourceIdentifier MyNewEmailAlert -Action $Action

Cały skrypt wygląda następująco:

$Action = {
	$Folder = $Sender.Session.GetDefaultFolder(6)
	$Item = $Folder.Session.GetItemFromID($Event.SourceArgs)

	$BalloonTipText = "Od: $($Item.SenderName)", "Do: $($Item.To)", "Temat: $($Item.Subject)" -join "`n"

	[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
	$NotifyIcon = New-Object System.Windows.Forms.NotifyIcon
	$NotifyIcon.Icon = "C:\Windows\System32\PerfCenterCpl.ico"
	$NotifyIcon.BalloonTipIcon = "Info"
	$NotifyIcon.BalloonTipText = $BalloonTipText
	$NotifyIcon.BalloonTipTitle = "Outlook"
	$NotifyIcon.Visible = $True

	$NotifyIcon.ShowBalloonTip(20000)

	Register-ObjectEvent $NotifyIcon BalloonTipClosed -SourceIdentifier MyBalloonTipClosed -Action {
		$Sender.Dispose()
		Unregister-Event -SourceIdentifier $Event.SourceIdentifier -Force
	}
}

$Outlook = New-Object -ComObject Outlook.Application
Register-ObjectEvent $Outlook NewMailEx -SourceIdentifier MyNewEmailAlert -Action $Action

Źródła:
http://technet.microsoft.com/en-us/library/hh849929
http://technet.microsoft.com/en-us/library/hh847768
http://msdn.microsoft.com/en-us/library/microsoft.office.interop.outlook.applicationevents_11_event.newmailex.aspx
http://msdn.microsoft.com/en-us/library/ff861868.aspx

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s