使用 Form.Show() 调用预加载器表单时,我的程序的通知图标会重复
My program's notifyicon get duplicated when using Form.Show() to call a preloader form
编辑: 真傻。我的预加载器实际上一直显示,即使是简单的 Loading.Show();
,但它只是在我的网络浏览器下方。我已经在下面发布了解决方案。感兴趣的可以看看
我的程序没有窗体,但在通知区域显示为通知图标(我的主窗体实际上是隐藏的,用作通知图标和其他控件的虚拟窗体)。它 运行 通过使用 URI 方案 (tkh
) 从 Web 浏览器调用。如果我的程序已经 运行ning 并且用户从浏览器调用它,它将根据其参数执行操作。例如,如果用户使用 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();
用于显示和关闭预加载器表单。 (我的预加载器表单名为 "Loading")
这是 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());
}
我的问题是,如果程序不是 运行ning,预加载器会出现并正常运行。但如果它已经 运行ning,预加载器将不会出现,但 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);
}
预加载器将出现并且通知图标会重复,如下所示
我需要关闭 "main" notifyicon 以使其全部消失。
我需要做什么?谢谢。
实际上,预加载器出现了,但它一直在我的网络浏览器下方。我需要做的就是创建以下覆盖函数以使其始终位于顶部(同时使我的 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;
}
}
引用此线程:
编辑: 真傻。我的预加载器实际上一直显示,即使是简单的 Loading.Show();
,但它只是在我的网络浏览器下方。我已经在下面发布了解决方案。感兴趣的可以看看
我的程序没有窗体,但在通知区域显示为通知图标(我的主窗体实际上是隐藏的,用作通知图标和其他控件的虚拟窗体)。它 运行 通过使用 URI 方案 (tkh
) 从 Web 浏览器调用。如果我的程序已经 运行ning 并且用户从浏览器调用它,它将根据其参数执行操作。例如,如果用户使用 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();
用于显示和关闭预加载器表单。 (我的预加载器表单名为 "Loading")
这是 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());
}
我的问题是,如果程序不是 运行ning,预加载器会出现并正常运行。但如果它已经 运行ning,预加载器将不会出现,但 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);
}
预加载器将出现并且通知图标会重复,如下所示
我需要关闭 "main" notifyicon 以使其全部消失。
我需要做什么?谢谢。
实际上,预加载器出现了,但它一直在我的网络浏览器下方。我需要做的就是创建以下覆盖函数以使其始终位于顶部(同时使我的 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;
}
}
引用此线程: