Thứ Hai, 10 tháng 12, 2012

C# – Tạo chương trình dạng Single-instance

C# – Tạo chương trình dạng Single-instance - chỉ có một phiên bản chạy

Đôi lúc chúng ta cần ngăn cản ứng dụng khởi chạy nhiều lần để làm giảm phiền toái cho người dùng. Vậy có cách nào để làm được điều này hay không. Sau đây tôi hướng đẫn bạn cách đơn giản nhất mà tôi hay dùng. Tuy nhiên tôi chỉ hướng đẫn phần cơ bản còn vận dụng như thế nào thì tùy ở mỏi người.
-Có 1 số cách để giải quyết vấn đề này, hay gặp là sử dụng Mutex và Process. Tuy nhiên chúng chỉ kiểm tra xem 1 instance của chuơng trình có đang chạy hay ko và ko thể điều khiển được instance đó (như việc active cửa sổ chính chẳng hạn).

Cách 1:
Sử dụng class System.Diagnostics.Process. Sau đây là đoạn code minh họa.
string current = System.Diagnostics.Process.GetCurrentProcess().ProcessName;  System.Diagnostics.Process[] procs;  procs = System.Diagnostics.Process.GetProcessesByName(current);  if (procs.Length >= 2)  {  MessageBox.Show("Process is already running!");  Application.Exit();  return;  }

Ở đây cần chú ý rằng. Cần phải kiểm tra Length >= 2 thì mới kết luận là ứng dụng đã khởi chạy rồi. Vì ứng dụng mình vừa chạy lên và ứng dụng cũ đang chạy là hai. Nếu có từ hai cái trở lên thì ứng dụng vừa chạy lên sẻ tắt process của nó đi. Vì vậy sẻ đảm bảo là một ứng dụng không có 2 Process chạy song song.
Cách này được tôi dùng phổ biến. Tuy nhiên phải tùy tùy biến lại chút ít cho trường hợp hai ứng dụng khác nhau nhưng được đặt trùng tên….

Cách 2  :

tận dụng thư viện Visual Basic trong .Net. Trước khi gõ code bạn hãy add reference thư viện Microsoft.VisualBasic vào.

AddReference

Phải add thư viện này bạn mới có thể dùng using Microsoft.VisualBasic.ApplicationServices mà ta sẽ sử dụng trong bài được.

Sửa file Program.cs như sau:

 

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Threading;
using Microsoft.VisualBasic.ApplicationServices;
namespace WindowsApplication1
{
static class Program
{
// Form chính cần gọi của chương trình phải đặt là static
static Form1 frm;
[STAThread]
static void Main(string[] args)
{
Application.EnableVisualStyles();
frm = new Form1();
SingleInstanceApplication.Run(frm, NewInstanceHandler);
}
public static void NewInstanceHandler(object sender,
StartupNextInstanceEventArgs e)
{
// Kích hoạt cửa sổ của instance đang chạy
// Bạn có thể thay thế bằng 1 hành động khác
frm.Activate();
}
/// <summary>
/// Lớp này dùng để gọi chạy form dạng single instance
/// </summary>
public class SingleInstanceApplication : WindowsFormsApplicationBase
{
private SingleInstanceApplication()
{
base.IsSingleInstance = true;
}
public static void Run(Form f,
StartupNextInstanceEventHandler startupHandler)
{
SingleInstanceApplication app = new SingleInstanceApplication();
app.MainForm = f;
app.StartupNextInstance += startupHandler;
app.Run(Environment.GetCommandLineArgs());
}
}
}
}


  Như bạn có thể thấy

Trích dẫn:
app.Run(Environment.GetCommandLineArgs());

Bạn có thể dễ dàng điều khiển instance đã chạy của mình bằng cách thiết lập các hành động sẽ xử lý tùy thuộc vào các tham số sẽ truyền vào thông qua dòng lệnh. Khi đó bạn có thể khởi tạo form như sau:

Code:

frm=new Form1(args[0]);

và trong constructor của Form1 bạn sẽ viết code kiểm tra và xử lý, ví dụ args[0]=="/scan" thì thực hiện lệnh scan máy chẳng hạn.

Hi vọng bài viết này giúp đỡ giải quyết 1 số vấn đề mà các bạn gặp phải.

(Sưu tầm)

Nếu thấy bài viết hữu ích hãy +1 giúp trang này : Dịch vụ Seo website giá rẻ có tại http://seowebsitegiare.com




Không có nhận xét nào:

Liên kết quảng cáo :