วิธีการทำ Single-Instance Applications

โดยปกติเมื่อเราสร้าง Windows Application หรือ WPF Application ผู้ใช้จะสามารถเปิด 1 โปรแกรมได้หลายหน้าต่างดังรูปด้านบน ซึ่งดูแล้วไม่ make sense เท่าที่ควรจะเป็น หรือในอีกแง่หนึ่งเมื่อเราทำแบบนี้โปรแกรมอาจมีปัญหาได้โดย
เฉพาะอย่างยิ่งโปรแกรมทีมีการโหลดข้อมูลไฟล์จากที่เดียวกัน
ตัวอย่างเช่น เราต้องการสร้าง Application ที่เปิดได้เพียงหน้าต่างเดียวแบบที่ Microsoft Word ทำเราควรทำอย่างไร
WPF ไม่ได้ provide วิธีการทำ Single-Instance applications ไว้ แต่เราทำได้หลายวิธี
วิธีนี้เป็นวิธีหนึ่งที่จะเสนอจะเป็นการสร้าง startup application มาใหม่
โดยหลักการเรียก Application ของ WPF จะเป็นดังรูป

วิธีการทำ
1. add reference ของ Microsoft.VisualBasic.dll เข้ามาที่ Project

2. แก้ไข Class ของ App
public partial class App : Application
{protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);//Load Main Windows
Window1 win = new Window1();
this.MainWindow = win;
win.Show();if (e.Args.Length > 0)
ShowDocument();
}public void ShowDocument()
{
MessageBox.Show("Application's already running");
}
}
3. สร้าง Class SingleInstanceApplicationWrapper ซึ่งเป็นตัวเก็บ Application ของเราก่อนที่จะ Run และทำการ เรียก Object ของ App
public class SingleInstanceApplicationWrapper : Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase
{
public SingleInstanceApplicationWrapper()
{
//Enable Single-Instance mode.
this.IsSingleInstance = true;}
//Create the WPF application class
public App app;
protected override bool OnStartup(Microsoft.VisualBasic.ApplicationServices.StartupEventArgs eventArgs)
{
app = new App();
app.Run();
return false;
}//Direct multiple instances.
protected override void OnStartupNextInstance(Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs eventArgs)
{
if (app.MainWindow != null)
app.ShowDocument();
if (eventArgs.CommandLine.Count > 0)
{
app.ShowDocument();
}
}
}
4. สร้าง Statup Class ไปเรียก Object ของ SingleInstanceApplicationWrapper
public class Startup
{
[STAThread]
public static void Main(string[] args)
{
SingleInstanceApplicationWrapper wrapper = new SingleInstanceApplicationWrapper();
wrapper.Run(args);
}
}
5.ไปที่ Properties ของ Project จากนั้นเลือกที่ Application > Startup Object : > WPFSingleInstance.Startup

ผลลัพท์ :

Download : WPFSingleInstance - 9Neung.com.zip
Password : 9Neung.com