C# 是不是可以从后台进程的控制台应用程序发送 Toast / BalloonTip?

Posted

技术标签:

【中文标题】C# 是不是可以从后台进程的控制台应用程序发送 Toast / BalloonTip?【英文标题】:C# Is it possible to send Toast / BalloonTip from Console App that a Background Process?C# 是否可以从后台进程的控制台应用程序发送 Toast / BalloonTip? 【发布时间】:2021-10-30 18:11:18 【问题描述】:

我正在开发一个应该在 PC 启动后运行的应用程序(Windows 10 C# Windows 控制台应用程序)

因此我使用 schtask 来解决它,如下所示:

schtasks /create /sc ONSTART /tn "RamanLocalServer" /tr "$INSTDIR\RamanLocalServer.exe" /ru System
schtasks /run /tn "RamanLocalServer"

这是一个完全没有 UI 的 Rahman 服务器(只有控制台应用程序)

这是我位于 TaskManager 的程序

现在,我希望这个本地服务器向用户显示通知

---------------尝试1:----------

根据C# How to Make a BalloonToolTip from a Non-Form Application是可以做到的

但是,由于我的程序位于后台进程,它显示没有Balloontooltip

我这样包装代码

private static void BalloonTip()
        
            notifyIcon = new NotifyIcon();
            notifyIcon.Icon = Properties.Resources.new_icon;
            notifyIcon.Visible = true;
            log.Debug("Balloon on server");
            try
            
                notifyIcon.ShowBalloonTip(600, "Rahman Updater", "New update is available\nGo to Rahman Manager to update", ToolTipIcon.Info);
            
            catch (Exception e)
            
                log.Error(e.Message);
                log.Error(e.StackTrace);
                throw;
            
        

日志文件没有说明异常

---------------Attempt2:----------

我尝试按照此处https://docs.microsoft.com/en-us/uwp/api/windows.ui.notifications.toastnotification?view=winrt-20348 的说明使用 Toast

这就是我写代码的方式

private static void CallToast()
        
            log.Debug("Toast1");
            try
            
                //// Requires Microsoft.Toolkit.Uwp.Notifications NuGet package version 7.0 or greater
                //new ToastContentBuilder()
                    .AddArgument("action", "viewConversation")
                    .AddArgument("conversationId", 9813)
                    .AddText("Guardian Updater")
                    .AddText("New update is available\nGo to Guardian Manager to update")
                    .Show(); // Not seeing the Show() method? Make sure you have version 7.0, and if you're using .NET 5, your TFM must be net5.0-windows10.0.17763.0 or greater
            
            catch (Exception e)
            
                log.Error(e.Message);
                log.Error(e.StackTrace);
            
        

它在日志Access denied. (Exception occurred HRESULT: 0x80070005 (E_ACCESSDENIED)上显示这个错误


但是,如果我像这样通过双击它来启动程序,它适用于 Toast/Balloon 工具提示

根据***社区(对不起,我找不到链接),我了解到

为了使其正常工作(Toast/Balloon Tooltip),代码应该在 UI 线程上运行

所以我的问题是,这可能吗?

如果没有,有什么建议吗?

【问题讨论】:

你有/ru System 很明显它作为系统未登录用户运行...系统帐户无法与用户桌面交互..除非您将创建可以从系统应用程序接收一些 IPC 消息的用户应用程序显示你需要什么......最终你可以在用户使用用户凭据登录时启动你的应用程序 感谢您的评论。对不起,这是一个愚蠢的问题。所以我不能作为系统运行以使其工作?我使用系统是因为这个程序在用户开始登录之前从电脑启动开始运行 正如我所写...那么您必须有 2 个应用程序(系统和用户)和一些 IPC(fx NetNamedPipe WCF)才能在它们之间进行通信 嗯,我明白了。感谢您的洞察力,让我重新设计程序 【参考方案1】:

那是我在 *** 上的帐户以某种方式重新启动之前提出问题的人

我解决了这个问题 作者:

    制作一个负责气球提示的新可执行文件 让它在托盘上永远运行(c# 可以做到) 为了触发该可执行文件,我将该程序注册到启动程序列表

【讨论】:

以上是关于C# 是不是可以从后台进程的控制台应用程序发送 Toast / BalloonTip?的主要内容,如果未能解决你的问题,请参考以下文章

C# - 向子进程发送输入 - 控制台应用程序

C#开发Linux守护进程

.NET跨平台实践:用C#开发Linux守护进程

.NET跨平台实践:用C#开发Linux守护进程(转)

.NET跨平台实践:用C#开发Linux守护进程-Daemon

c#线程之前台线程后台线程及使用