我想阻止用户在同一台机器上多次运行我的应用程序,所以我使用了这个帖子的解决方案:What is the correct way to create a single-instance application?
这样可行,但在打开模态窗口时显示我的应用程序时出现问题(例如使用Array
(
[0] => Array
(
[size] => 40x80x1.15x6M
[weight] => 12800
[piece_per_bundle] => 50
[total_bundle] => 20
[total_piece] => 1000
[total_quantity_(MTs)] => 12800
[tanggal_plan_masuk] => 01-05-2017
[nama_file] => PACKING LIST 68 LOT 1 WITH COLORS MARK.xlsx
[urut] => 1
[row] => 34
[container] => SITU9026744
[seal] => SITC853014
)
[1] => Array
(
[size] => 40x60x1.15x6M
[weight] => 10630
[piece_per_bundle] => 50
[total_bundle] => 10
[total_piece] => 500
[total_quantity_(MTs)] => 5315
[tanggal_plan_masuk] => 01-05-2017
[nama_file] => PACKING LIST 68 LOT 1 WITH COLORS MARK.xlsx
[urut] => 2
[row] => 35
[container] => SITU9026744
[seal] => SITC853014
)
[2] => Array
(
[size] => 19x19x0.92x6M
[weight] => 3160
[piece_per_bundle] => 100
[total_bundle] => 12
[total_piece] => 1200
[total_quantity_(MTs)] => 3792
[tanggal_plan_masuk] => 01-05-2017
[nama_file] => PACKING LIST 68 LOT 1 WITH COLORS MARK.xlsx
[urut] => 3
[row] => 36
[container] => SITU9026744
[seal] => SITC853014
)
)
)。这是一个场景:
PS - 当应用程序运行并打开模态窗口时,当我将鼠标悬停在任务栏中的图标上时,我可以看到两个窗口 - 主窗口和模态窗口。我可以点击主窗口(这当然是禁用的,因为模态窗口在它上面)我也可以点击模态窗口。我的解决方案就像我点击主窗口一样,但我希望它能够激活最顶层的窗口,在这种情况下是模态的。
那么,任何想法如何将最上面的模态窗口(或主窗口,如果没有显示模态窗口)带到前面?
答案 0 :(得分:1)
问题中描述的行为表明主窗口不拥有对话框。
请注意,当某个对话框由(主)窗口拥有时,该窗口无法覆盖该对话框(该对话框通常始终位于窗口顶部)。 这也会产生这样的效果:当窗口移到前面时,对话框也会被带到窗口的正面 - 这样可以很好地解决你遇到的问题。
设置对话框(模态窗口)的所有者非常简单。在显示对话框之前,只需将其Owner属性设置为主窗口,类似于此示例:
Window modalWindow = ... create modal window instance
modalWindow.Owner = mainWindow;
modalWindow.ShowDialog();
(旁注:如果还希望任务栏中只显示主窗口的图标/缩略图,则模态窗口的ShowInTaskbar属性应设置为false
。)
答案 1 :(得分:0)
使应用程序成为计算机上的单个实例的最佳解决方案是使用命名互斥锁
以下是相同文档的摘录
互斥锁有两种类型:本地互斥锁(未命名)和命名系统互斥锁。本地互斥锁仅存在于您的进程中。它可以被进程中的任何线程使用,该线程具有对表示互斥锁的Mutex对象的引用。每个未命名的Mutex对象代表一个单独的本地互斥锁。 命名系统互斥体在整个操作系统中都是可见的,可用于同步进程的活动。
您可以使用接受名称的构造函数创建表示命名系统互斥锁的Mutex对象。操作系统对象可以同时创建,也可以在创建Mutex对象之前存在。您可以创建表示同一命名系统互斥锁的多个互斥锁对象,并且可以使用OpenExisting方法打开现有的命名系统互斥锁。
而且,无论如何,你已经处理了你想要推出第一个实例的情况。