通知图标未显示在托盘C#winforms中
为什么我启动Windows窗体时,系统托盘中没有显示通知图标?
这是我正在做的。
我有一个Windows服务,它启动我的托盘应用程序,这是一个Windows窗体应用程序(我使用模拟在当前用户的上下文中启动该应用程序)。 在托盘应用程序中,我启动了一个包含通知图标的表单。
这里的问题是,有时通知图标不会出现在系统托盘中,我无法找出原因。
在窗体的OnLoad方法中,我将窗体的visible属性设置为false。 另外我正在做一些远程服务调用(如ipc)。那是问题吗?
如何让我的通知图标始终出现在系统托盘中?
编辑:这里是的OnLoad功能
通知图标未显示在托盘C#winforms中
protected override void OnLoad(System.EventArgs e)
{
this.Visible = false;
//Get some value from registry
CheckForStealthMode();
GetLoginType();
bool GetProbeStatus = false;
ServiceActivityInterface remoteMethods = null;
do
{
try
{
remoteMethods = (ServiceActivityInterface)Activator.GetObject(typeof(ServiceActivityInterface), "tcp://localhost:18800/ServiceRemoting);
ProbeStatus = remoteMethods.GetProbeStatus();
GetProbeStatus = true;
}
catch (Exception exception)
{
GetProbeStatus = false;
log.Error("Exception while getting the status of Probe:" + exception.Message);
}
finally
{
remoteMethods = null;
if (!GetProbeStatus)
{
Thread.Sleep(5000);
log.Debug("Retrying to get the probe status.");
}
}
} while (!GetProbeStatus);
}
代码现在我会建议身边的通知图标代码或其他条件语句几个断点发现,如果事情没有被调用。尝试并找到一致的复制方式,以帮助您诊断正在发生的事情。我有过奇怪的往事,其中最混乱的是一个链接到定时事件
我也建议(这可能会解决您的问题,如果它确实涉及Thread.Sleep方法,这是不理想的。用户只是得到一个冻结的用户界面,使用其中一个计时器类,并拿起勾号或经过的事件,以便用户可以继续,但你仍然可以得到延迟后你。
看看你的OnLoad
方法,你已经有一个潜在的无限循环,每5秒只能执行一次,如果有任何怀疑抛出异常,并记录异常然后抛弃。当你阻止UI线程,并最有可能阻止通知图标显示。看看Activator.GetObject
或RPC GetProbeStatus
调用,并考虑将RPC代码移到另一个线程以避免阻塞UI。
是的,你是正确的RPC阻止UI线程我已经转移到新的线程。但即使在那之后,我也遇到了同样的问题。我只是通过将通知图标的可见属性设置为false来发现临时解决方案,然后再次变为真实,奇怪但适用于我。 – Prasad
你可以在你的OnLoad方法中分享代码吗? –
只是托盘图标没有显示出来,或者是其他任何操作都无法按预期运行?您是否检查过Windows事件查看器,以查看应用程序事件日志(甚至安全日志)中是否有任何报告? –
@ Ben Scott我发布了问题中的代码。 – Prasad