Is it possible to send a Toast notification from a console application?

Can I send Toast notifications from a console application using ToastNotificationManager ?

I know that you can send Toast notifications from a Windows Universal application:

var toast = new ToastNotification(doc); ToastNotificationManager.CreateToastNotifier().Show(toast); 

* doc - Toast stored in XML string

To use ToastNotificaionManager, I need the Windows.UI.Notifications library, which I cannot reference in the console application project.

The library I mentioned earlier is actually used by WinRT. Can I use the WinRT API in a Windows console application?

+5
source share
3 answers

First you need to declare that your program will use winRT libraries:
1. Right-click your project, select Upload Project
2. Right-click on your project (not available) and click Modify your project .csproj
3. Add a new property group: <targetplatformversion>8.0</targetplatformversion>
4. Project reload
5. Add a Windows Referee from Windows> Core
enter image description here

Now you need to add this code:

 using Windows.UI.Notifications; 

and you can send notifications using this code:

 var toast = new ToastNotification(doc); ToastNotificationManager.CreateToastNotifier().Show(toast); 

Link: How to call the WinRT API in Windows 8 from C # desktop applications - WinRT diagram

+11
source

I'm having trouble with the Evaldas B code. I was missing a line. (Where it says "Need a line")

.CreateToastNotifier(<needed a string here>).Show(toast);

warning I'm kind of new to C #, so my code probably sucks, but it works and is pretty simplistic, and that's more than I can say for most of the solutions I found

Also, I was getting damn time to read an XML document. I fought System.xml (I think) and Windows.Data.Dom.Xml (also not quite sure). In the end, I decided to make them hardcoded strings for my example file and used the switch statement to switch between them. I found a ton of people looking for the solution I came up with overflowing the stack. It seems that using a toast notification system with console or background applications would be very useful, and the documentation that surrounds the toast notification system using Windows applications suggests that it should be used with the application. The action center is very useful for notifications along the NotificationTray / NotifyIcon route. I did not find a complete solution elsewhere on the Internet. Here is a sample code.

 /* At first you need to declare that your program will be using winRT libraries: 1. Right click on your yourProject, select Unload Project 2. Right click on your youProject(unavailable) and click Edit yourProject.csproj 3. Add a new property group:<TargetPlatformVersion>8.0</TargetPlatformVersion> 4. Reload project 5. Add referece Windows from Windows > Core */ using System; using Windows.Data.Xml.Dom; using Windows.Storage; using Windows.Storage.Streams; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Windows.UI.Notifications; namespace ConsoleApplication6 { public class NewToastNotification { public NewToastNotification(string input, int type) { string NotificationTextThing = input; string Toast = ""; switch (type) { case 1: { //Basic Toast Toast = "<toast><visual><binding template=\"ToastImageAndText01\"><text id = \"1\" >"; Toast += NotificationTextThing; Toast += "</text></binding></visual></toast>"; break; } default: { Toast = "<toast><visual><binding template=\"ToastImageAndText01\"><text id = \"1\" >"; Toast += "Default Text String"; Toast += "</text></binding></visual></toast>"; break; } } XmlDocument tileXml = new XmlDocument(); tileXml.LoadXml(Toast); var toast = new ToastNotification(tileXml); ToastNotificationManager.CreateToastNotifier("New Toast Thing").Show(toast); } } class Program { static void Main(string[] args) { NewToastNotification Window = new NewToastNotification("Yes",1); } } } 
+3
source

1) To receive notification of a toast using the console or desktop application, your application must have a shortcut in the Start menu.

2) For the application to have a shortcut icon (not a tile icon) in the Windows Start menu, your application must have an AppId. To create an abbreviation for you, you create a new class called ShellHelpers.cs and paste this code into it.

 using System; using System.Runtime.InteropServices; using System.Text; using Microsoft.WindowsAPICodePack.Shell.PropertySystem; using MS.WindowsAPICodePack.Internal; namespace DesktopToastsSample.ShellHelpers { internal enum STGM : long { STGM_READ = 0x00000000L, STGM_WRITE = 0x00000001L, STGM_READWRITE = 0x00000002L, STGM_SHARE_DENY_NONE = 0x00000040L, STGM_SHARE_DENY_READ = 0x00000030L, STGM_SHARE_DENY_WRITE = 0x00000020L, STGM_SHARE_EXCLUSIVE = 0x00000010L, STGM_PRIORITY = 0x00040000L, STGM_CREATE = 0x00001000L, STGM_CONVERT = 0x00020000L, STGM_FAILIFTHERE = 0x00000000L, STGM_DIRECT = 0x00000000L, STGM_TRANSACTED = 0x00010000L, STGM_NOSCRATCH = 0x00100000L, STGM_NOSNAPSHOT = 0x00200000L, STGM_SIMPLE = 0x08000000L, STGM_DIRECT_SWMR = 0x00400000L, STGM_DELETEONRELEASE = 0x04000000L, } internal static class ShellIIDGuid { internal const string IShellLinkW = "000214F9-0000-0000-C000-000000000046"; internal const string CShellLink = "00021401-0000-0000-C000-000000000046"; internal const string IPersistFile = "0000010b-0000-0000-C000-000000000046"; internal const string IPropertyStore = "886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99"; } [ComImport, Guid(ShellIIDGuid.IShellLinkW), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] internal interface IShellLinkW { UInt32 GetPath( [Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile, int cchMaxPath, //ref _WIN32_FIND_DATAW pfd, IntPtr pfd, uint fFlags); UInt32 GetIDList(out IntPtr ppidl); UInt32 SetIDList(IntPtr pidl); UInt32 GetDescription( [Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile, int cchMaxName); UInt32 SetDescription( [MarshalAs(UnmanagedType.LPWStr)] string pszName); UInt32 GetWorkingDirectory( [Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDir, int cchMaxPath ); UInt32 SetWorkingDirectory( [MarshalAs(UnmanagedType.LPWStr)] string pszDir); UInt32 GetArguments( [Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszArgs, int cchMaxPath); UInt32 SetArguments( [MarshalAs(UnmanagedType.LPWStr)] string pszArgs); UInt32 GetHotKey(out short wHotKey); UInt32 SetHotKey(short wHotKey); UInt32 GetShowCmd(out uint iShowCmd); UInt32 SetShowCmd(uint iShowCmd); UInt32 GetIconLocation( [Out(), MarshalAs(UnmanagedType.LPWStr)] out StringBuilder pszIconPath, int cchIconPath, out int iIcon); UInt32 SetIconLocation( [MarshalAs(UnmanagedType.LPWStr)] string pszIconPath, int iIcon); UInt32 SetRelativePath( [MarshalAs(UnmanagedType.LPWStr)] string pszPathRel, uint dwReserved); UInt32 Resolve(IntPtr hwnd, uint fFlags); UInt32 SetPath( [MarshalAs(UnmanagedType.LPWStr)] string pszFile); } [ComImport, Guid(ShellIIDGuid.IPersistFile), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] internal interface IPersistFile { UInt32 GetCurFile( [Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile ); UInt32 IsDirty(); UInt32 Load( [MarshalAs(UnmanagedType.LPWStr)] string pszFileName, [MarshalAs(UnmanagedType.U4)] STGM dwMode); UInt32 Save( [MarshalAs(UnmanagedType.LPWStr)] string pszFileName, bool fRemember); UInt32 SaveCompleted( [MarshalAs(UnmanagedType.LPWStr)] string pszFileName); } [ComImport] [Guid(ShellIIDGuid.IPropertyStore)] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface IPropertyStore { UInt32 GetCount([Out] out uint propertyCount); UInt32 GetAt([In] uint propertyIndex, out PropertyKey key); UInt32 GetValue([In] ref PropertyKey key, [Out] PropVariant pv); UInt32 SetValue([In] ref PropertyKey key, [In] PropVariant pv); UInt32 Commit(); } [ComImport, Guid(ShellIIDGuid.CShellLink), ClassInterface(ClassInterfaceType.None)] internal class CShellLink { } public static class ErrorHelper { public static void VerifySucceeded(UInt32 hresult) { if (hresult > 1) { throw new Exception("Failed with HRESULT: " + hresult.ToString("X")); } } } } 

Code for creating a shortcut (this code can be added to the same class where you will show the toast)

 public bool TryCreateShortcut() { String shortcutPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\Microsoft\\Windows\\Start Menu\\Programs\\FixSus Toasts Sample .lnk"; if (!File.Exists(shortcutPath)) { InstallShortcut(shortcutPath); return true; } return false; } private void InstallShortcut(String shortcutPath) { // Find the path to the current executable String exePath = Process.GetCurrentProcess().MainModule.FileName; IShellLinkW newShortcut = (IShellLinkW)new CShellLink(); // Create a shortcut to the exe DesktopToastsSample.ShellHelpers.ErrorHelper.VerifySucceeded(newShortcut.SetPath(exePath)); DesktopToastsSample.ShellHelpers.ErrorHelper.VerifySucceeded(newShortcut.SetArguments("")); // Open the shortcut property store, set the AppUserModelId property IPropertyStore newShortcutProperties = (IPropertyStore)newShortcut; using (PropVariant appId = new PropVariant(APP_ID)) { DesktopToastsSample.ShellHelpers.ErrorHelper.VerifySucceeded(newShortcutProperties.SetValue(SystemProperties.System.AppUserModel.ID, appId)); DesktopToastsSample.ShellHelpers.ErrorHelper.VerifySucceeded(newShortcutProperties.Commit()); } // Commit the shortcut to disk IPersistFile newShortcutSave = (IPersistFile)newShortcut; DesktopToastsSample.ShellHelpers.ErrorHelper.VerifySucceeded(newShortcutSave.Save(shortcutPath, true)); } 

Now you can create a toast show

 // Get a toast XML template XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastImageAndText04); // Fill in the text elements XmlNodeList stringElements = toastXml.GetElementsByTagName("text"); stringElements[1].AppendChild(toastXml.CreateTextNode("Message" + newMessage)); // Specify the absolute path to an image string codeWebFolderPath = Path.GetFullPath(Path.Combine(Environment.CurrentDirectory, @"..\..\")); String imagePath = "file:///" + Path.GetFullPath(codeWebFolderPath+ "Resources\\FixSus.png"); XmlNodeList imageElements = toastXml.GetElementsByTagName("image"); imageElements[0].Attributes.GetNamedItem("src").NodeValue = imagePath; // Create the toast and attach event listeners ToastNotification toast = new ToastNotification(toastXml); toast.Activated += ToastActivated; toast.Dismissed += ToastDismissed; toast.Failed += ToastFailed; // Show the toast. Be sure to specify the AppUserModelId on your application shortcut! ToastNotificationManager.CreateToastNotifier(APP_ID).Show(toast); 

APP_ID can be any string. In my case, it was a "NotificationTest.KEY" Note. Do not modify the ShellHelper class. Edit: Follow Evaldas B first, then apply this solution.

0
source

All Articles