使用Form.Show()调用预加载器表单时,我的程序的notifyicon会重复

时间:2018-04-11 03:49:04

标签: c# winforms preloader notifyicon

编辑:傻我。即使使用简单的tkh,我的预加载器实际上也会显示,但它只是在我的网络浏览器下面。我已在下面发布了解决方案。如果您有兴趣,请检查一下。

我的程序没有任何形式,但在通知区域显示为notifyicon(我的主表单实际上是隐藏的,用作notifyicon和其他控件的虚拟表单)。它通过使用URI方案(tkh:readCard)从Web浏览器调用来运行。如果我的程序已经运行并且用户从浏览器调用它,它将根据其参数执行操作。例如,如果用户使用readCard调用它,我的程序将在public string CommandLine { get; set; } public bool CheckForProtocolMessage(Uri uri) { if (uri.ToString().Length > 1) { string[] args = uri.ToString().Split(':'); CommandLine = args[1]; if (args[0].Trim().ToUpper() == "TKH" && args.Length > 1) { if (args[1].Length > 1) { switch (args[1].Trim().ToUpper()) { case "READCARD": if (hasCardReader == true) { var bw_readCard = new BackgroundWorker { WorkerReportsProgress = true }; bw_readCard.DoWork += delegate { preloaderShow(); readCard(); preloaderClose(); }; bw_readCard.ProgressChanged += delegate { }; bw_readCard.RunWorkerCompleted += delegate { }; bw_readCard.RunWorkerAsync(); bw_readCard.Dispose(); return true; } else { MessageBox.Show("Try again", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return false; } case "READCARD_IDONLY": if (hasCardReader == true) { var bw_readCard_IDOnly = new BackgroundWorker { WorkerReportsProgress = true }; bw_readCard_IDOnly.DoWork += delegate { preloaderShow(); readCard_IDonly(); preloaderClose(); }; bw_readCard_IDOnly.ProgressChanged += delegate { }; bw_readCard_IDOnly.RunWorkerCompleted += delegate { }; bw_readCard_IDOnly.RunWorkerAsync(); bw_readCard_IDOnly.Dispose(); return true; } else { MessageBox.Show("Try again", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return false; } } } } } return false; } 函数中执行操作。

这是我从URI方案中读取参数的代码

preloaderShow();

preloaderClose();preloaderShow();用于展示并关闭预加载器表单。 (我的预加载器表单名为"正在加载")

这是private void preloaderShow() { Loading Loading = new Loading(); Loading.Show(); } 功能

preloaderClose();

private void preloaderClose() { Loading Loading = new Loading(); Application.OpenForms .OfType<Form>() .Where(form => String.Equals(form.Name, "Loading")) .ToList() .ForEach(form => form.Close()); } 函数

readCard();

我的问题是如果程序没有运行,预加载器会显示并正常运行。但如果它已经运行,则预加载器不会显示,但readCard_IDOnly();private void preloaderShow() { Loading Loading = new Loading(); Form1 Form1 = new Form1(); // Declared this even without put Form1 into .Show() also make the program's notifyicon duplicate. Loading.Show(Form1); } 中的内容正常工作。

如果我改变了我的preloaderShow();像这样,

sender_id = "";
receiver_id = "1";

预加载器将显示,并且notifyicon会重复,如下所示

but notifyicon will duplicated and cannot be closed

我需要关闭&#34; main&#34; notifyicon让它全部消失。

我需要做什么?感谢。

1 个答案:

答案 0 :(得分:0)

实际上,预加载器出现了,但它始终低于我的网络浏览器。我需要做的就是创建以下覆盖函数以使其始终位于顶部(同时使我的Windows不会关注此预加载器表单。)

protected override bool ShowWithoutActivation { get { return true; } }
protected override CreateParams CreateParams
{
    get
    {
        int WS_EX_TOPMOST = 0x00000008;
        CreateParams cp = base.CreateParams;
        cp.ExStyle |= WS_EX_TOPMOST;
        return cp;
    }
}

参考此主题:https://stackoverflow.com/a/10727337/4535654