Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 5 của 5
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Chỉ 1 biểu mẩu được thể hiện trong ứng dụng WinForm sử dụng C#.

    Chỉ 1 biểu mẩu được thể hiện trong ứng dụng WinForm sử dụng C#.

    Giới thiệu:

    Thỉnh thoảng mình nhận được câu hỏi, trong Window Form, mình sử dụng C# làm sao có thể cho phép Form trong ứng dụng của mình chỉ chạy 1 lần duy nhất? và sẻ thông báo lổi, nếu như mình cố gắng chạy nó lần thứ 2.

    Thông điệp lổi cũng giống như mình đang cố gắng cài đặt SQL Server 2005, trong khi quá trình cài đặt trước đó vẩn đang chạy.

    Giải quết vấn đề như thế nào?

    Với vấn đề trên thì chúng ta có thể dể dàng làm được với Visual Basic. NET, chỉ cần “quýnh dấu” cái lựa chọn Make single instance application, và viết thông điệp lồi mà bạn muốn hiển thị trong sự kiện MyApplication_StartupNextInstance.

    Thế còn trong C# thì sao? Có rất nhiều giải pháp để làm việc này,ví dụ: kiểm tra tiến trình đang chạy, hoặc sử dụng code không tự quản…. Nhưng những cách trên chưa phải là 1 cách tiếp cận vấn đề tốt nhất, trong bài này mình sẻ sử dụng .NET 2.0 với sự hiện diện của Microsoft.VisualBasic.dll.

    Nó cung cấp rất nhiều chức năng hửu ích, mà nhiều người vẩn ngại tham chiếu nó vào ứng dụng của mình. Cám ơn Microsoft đả tích hợp DLL này như 1 phần của Net Framework.

    Được rồi, bây giờ chúng ta bắt đầu :

    Đầu tiên tạo 1 project Window Form C#, đặt tên là gì tuỳ ý, mình đặt là : SingleInstanceApp, và sửa tên Form1 thành MainForm, dể dàng cho việc nhận biết. Và 1 điều rất quan trọng là chúng ta phải tham chiếu Microsoft.VisualBasic.dll.



    Để cho dể dàng, chúng tạo 1 lớp dung để xử lý việc này, đặt tên là SingleInstance.cs, lớp này sẻ kế thừa từ lớp WindowsFormsApplicationBase , chúng ta sẻ phải thêm vào câu lệnh using Microsoft.VisualBasic.ApplicationServices;

    Đoạn mã sẻ trong có dạng như sau:


    Mã:
    using System;using System.Windows.Forms;using Microsoft.VisualBasic.ApplicationServices; namespace SingleInstanceApplication{    class SingleInstance : WindowsFormsApplicationBase    {        private SingleInstance()        {            base.IsSingleInstance = true;        }         public static void Run(Form f,StartupNextInstanceEventHandler startupHandler)        {            SingleInstance app = new SingleInstance();            app.MainForm = f;            app.StartupNextInstance += startupHandler;            app.Run(Environment.GetCommandLineArgs());        }         public static void StartupNextInstanceHandler(object sender, StartupNextInstanceEventArgs e)        {            foreach (string param in e.CommandLine)            {                MessageBox.Show(param+" is running."," Error ",MessageBoxButtons.OK,MessageBoxIcon.Error);            }        }    }}
    Chúng ta cũng đả thấy trong phương thức khởi tao của lớp, chúng ta thiết lập base.IsSingleInstance = true; nếu muốn cho phép Form của chúng ta chỉ chạy 1 lần.

    Nhìn vào phương thức Run, chúng ta cũng thấy, phương thức này nhận vào 2 tham số, tham số đầu tiên là tên Form mà ta muốn thiết lập, tham số thứ 2 là sự kiện của Form, ở đây mình thiết lập sự kiện khởi động cho lần thứ 2, các bạn có thề thiết lập các sự kiện khác như StartupEventHandler cho việc khởi động, và cũng có thể là ShutdownEventHandler.

    Mình cũng cài đặt phương thức thứ 2 dùng để hiển thị thông điệp đến người dùng.

    Bây giờ chúng ta quay lại MainForm, nơi mà chúng ta cần cho nó thể hiện chỉ 1 lần. Thay vì Application.Run(new MainForm()); chúng ta thay thế hàm đó như sau:

    Mã:
            static void Main()        {            Application.EnableVisualStyles();            Application.SetCompatibleTextRenderingDefault(false);            MainForm f = new MainForm();            SingleInstance.Run(f,new StartupNextInstanceEventHandler(                SingleInstance.StartupNextInstanceHandler));        }
    Mình chạy ứng dụng của mình trong thư mục Release và sẻ báo lổi điệp như thế này

    Kết luận:

    Vấn đề đả được sáng tỏ, 1 cách dể dàng, C# có thể sử dụng thư viện Visual Basic như Visual Basic, cám ơn Microsoft và đặc biệt là Microsoft Visual Basic team, người đả xây dựng VisualBasic.dll, có nhiều chức năng hữu dụng,cho việc xây dựng ứng dụng desktop 1 cách chắc chắn, linh động và thân thiện người dùng.

    Best,
    QuachNguyen
    All rights reserved

    Note: Thỉnh thoảng không nên sử dụng VisualBasic.dll trong ứng dụng, vì .NET thường hoạt động nhanh hơn 25%.

  2. #2
    Ngày tham gia
    Sep 2015
    Đang ở
    Số 60 Thái Hà, Đống Đa, Hà Nội
    Bài viết
    0
    Cám ơn bạn một bài viết rất hay và hữu ích. Nhưng có điều mình vẫn chưa hiểu là nếu ứng dụng có nhiều form mà mình muốn chỉ 1 ứng dụng của mình được chạy tại 1 thời điểm(vd tại thời điểm người dùng đã ẩn formMain đi và đang dùng form nào đó - gs form nhập liệu) vậy mình phải làm thế nào???

    cám ơn bạn 1 lần nữa.

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mình có đoạn code này ,mời các bạn tham khảo,chức năng là khi ứng dụng đang chạy mà mình mở lại ứng dụng đó thì sẽ thông báo lên màn hình

    Mã:
    using System;using System.Collections.Generic;using System.Windows.Forms;using System.Threading; namespace SortDemo{    static class Program    {        /// <summary>        /// The main entry point for the application.        /// </summary>        [STAThread]        static void Main()        {           bool ownsMutex;           using (Mutex mutex = new Mutex(true, "SortDemoRunning", out ownsMutex))           {               if (ownsMutex)               {                   Application.EnableVisualStyles();                   Application.SetCompatibleTextRenderingDefault(false);                   Application.Run(new MainForm());                   mutex.ReleaseMutex();//chi duoc mo 1 chuong trinh trong cua mot thoi diem               }               else MessageBox.Show("Can't o pen 2 windows of this program at the same time", "Notify", MessageBoxButtons.OK, MessageBoxIcon.Error);           }           }    }}
    Chúc các bạn thành công !
    YIM : Thanhhuy191188

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    hay quá, ứng dụng này rất giông với ứng dụng dùng thử sản phẩm. Mình đang định xây dựng ứng dụng chỉ chóp sử dụng trong một số ngày hoặc một số lần kể từ lần chạy đầu tiên. Ai có cách để tạo các ứng dụng chỉ cho phép dùng thử như mình đã nói thì giúp mình với nhé. Ngoài ra nếu có thể cho người dùng nhập KEY vào nữa để sử dụng thì hay quá, làm sao cho giống một phần mềm thương mại luôn ấy. Cám ơn các bạn.

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi TuanNghia
    hay quá, ứng dụng này rất giông với ứng dụng dùng thử sản phẩm. Mình đang định xây dựng ứng dụng chỉ chóp sử dụng trong một số ngày hoặc một số lần kể từ lần chạy đầu tiên. Ai có cách để tạo các ứng dụng chỉ cho phép dùng thử như mình đã nói thì giúp mình với nhé. Ngoài ra nếu có thể cho người dùng nhập KEY vào nữa để sử dụng thì hay quá, làm sao cho giống một phần mềm thương mại luôn ấy. Cám ơn các bạn.
    Em nghĩ là sẽ có các cách giải quyết như thế này :
    1. Anh tạo ra 1 Regedit trong lần chạy đầu tiên, thuật toán theo kiểu get ngày chạy soft và sinh ra Regedit Key tương ứng. Khi đó lần sau chạy soft sẽ dịch ngược mã ấy và tính ra số ngày đã dùng.

    2. Cách thủ công hơn là : Anh tạo ra 1 file tmp hay .dat gì đó và mã hóa nó: get ngày chạy đầu tiên, mã hóa và lưu ra file đó. Việc đặt file thì theo em nên giấu trong 1 file nào đó có tính cố định của Windows, và với tên gì đó ảo ảo 1 chút liên quan đến Windows như thế ng dùng dễ bị lừa và nhầm tưởng là file hệ thống. Lần sau chạy sẽ check file đó tồn tại hay không, nếu tồn tại thì get giá trị rồi tính toán ra số ngày đã sử dụng.
    Em mới học C# nên cũng mới nghĩ ra 2 cách trên thui ! [IMG]images/smilies/redface.png[/IMG]

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •