编程语言
首页 > 编程语言> > c# – 使用Form.Show()调用预加载器表单时,我的程序的notifyicon会重复

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

作者:互联网

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

我的程序没有任何形式,但在通知区域显示为notifyicon(我的主表单实际上是隐藏的,用作notifyicon和其他控件的虚拟表单).它通过使用URI方案(tkh)从Web浏览器调用来运行.如果我的程序已经运行并且用户从浏览器调用它,它将根据其参数执行操作.例如,如果用户使用tkh:readCard调用它,我的程序将在readCard函数中执行操作.

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

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;
        }

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();工作正常.

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

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);
        }

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

but notifyicon will duplicated and cannot be closed

我将需要关闭“主”通知图标以使其全部消失.

我需要做什么?谢谢.

解决方法:

实际上,预加载器显示但它始终低于我的Web浏览器.我需要做的就是创建以下覆盖函数以使其始终位于顶部(同时使我的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

标签:c,winforms,notifyicon,preloader
来源: https://codeday.me/bug/20190710/1425717.html