I tried using Powershell to listen to the Dismissed
event of a ToastNotification
as follows:
$toast = [Windows.UI.Notifications.ToastNotification]::new( ... )
$notifier = [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier( ... )
$notifier.Show($toast)
Register-ObjectEvent -InputObject $toast -EventName Dismissed -Action { ... }
Running this code, however, fails with the following exception message:
Windows PowerShell cannot subscribe to Windows RT events.
Therefore, I'd like to ask:
ToastNotification
(i.e. whether it is Activated
, Dismissed
, or Failed
) from Powershell? Any help is much appreciated.
We need to check with latest builds or simply close.
Any update on this in 2020? It's weird that I can do a ton of WinRT stuff, but then cannot register event handlers.
@citelao Do you test with latest PowerShell 7.0 build?
I found a workaround from @david-risney https://deletethis.net/dave/2016-06/WinRT+Toast+from+PowerShell
If you can get that working @iSazonov (or anyone out there) I'll send you a beer or something!
A lot of the APIs/References that uses have changed. I managed to compile and get it working on Windows 8 (maybe 8.1), but haven't been able to replicate on Windows 10 even after updating references etc. I even reached out to Dave at one point to see if he knew how to update it for Windows 10.
As for if it works on the current version, I test this in every Windows update and PowerShell release because I'm very invested in seeing this work. The answer today with Windows 10 1909 and PowerShell 7.1 is... no:
@Windos Please share you test script.
@iSazonov sure thing: https://gist.github.com/Windos/78ed980d926c634d0acede61e44a29af
GistExample of trying to register a Windows RT event via PowerShell, specifically here we're looking at events on Toast Notifications - Toast-RTEvent-Example.ps1
After reviewing this I see that PowerShell need a wrapper to process WinRT events.
I am not sure that it is stable area (API) to allow us to inject this in PowerShell engine. So best way to address the issue is to create a module in PowerShell Gallery.
Perhaps @rkeithhill could share thoughts.
@rjmholt @TylerLeonhardt Perhaps it is useful for PowerShell related projects.
It seems .Net Core has a code for WinRT events. https://github.com/dotnet/runtime/blob/c9edf7e621350ae8171e1ae4461d4a9e2c74c092/src/libraries/System.Runtime.WindowsRuntime/src/System/Runtime/InteropServices/WindowsRuntime/MarshalingHelpers.cs#L199 I don't know whether we use it.
GitHub.NET is a cross-platform runtime for cloud, IoT, and desktop apps. - dotnet/runtime
I wish I could be of more help actually writing a solution to this, my C# is both rusty and rudimentary 鈽癸笍
I can point to where the check for WinRT events in the PowerShell code base is though, in case that helps anyone: https://github.com/PowerShell/PowerShell/blob/b7cb335f03fe2992d0cbd61699de9d9aafa1d7c1/src/System.Management.Automation/engine/EventManager.cs#L675
It is block condition only for writing user friendly message. Really AddEventHandler() below does not support WinRT events.
If you want to get a progress you could open an issue-question in .Net Runtime repo about how work with WinRT events in .Net Core.
Most helpful comment
I found a workaround from @david-risney https://deletethis.net/dave/2016-06/WinRT+Toast+from+PowerShell