2011-10-26 15 views
8

Tôi muốn tạo ra một ứng dụng mà cư xử như sau:Làm cách nào để xử lý các đối số dòng lệnh trong Winforms nếu tôi không muốn tải biểu mẫu chính?

  1. On không tranh luận nó sẽ hiển thị dưới dạng chính
  2. On luận "a" không một công việc nhưng hình thức chính không được tải.
  3. On luận "b" các hình thức tải bằng cách sử dụng đối số được truyền (tải tài liệu)

Đối với 1 và 3 tôi có thể xử lý các đối số trong constructor của form như sau:

public ConfigurationActionManagerForm() 
{ 
    InitializeComponent(); 
    Environment.GetCommandLineArgs(); 
    // do stuff with that argument 
} 

Nhưng cách tiếp cận này không cho phép tôi áp dụng hành vi của 2. trong danh sách.

Trong program.cs Tôi có thể chỉnh sửa để xử lý các đối số trước khi biểu mẫu được tạo, nhưng cách tiếp cận chính xác khi sử dụng Application.Run() là gì nếu tôi không muốn chuyển biểu mẫu? Làm thế nào tôi sẽ thông báo cho cá thể lớp Program mà tôi cần phải chấm dứt hoặc hiển thị một thông báo rằng đã xảy ra sự cố hoặc thậm chí hiển thị một biểu tượng trên thanh tác vụ nhỏ mà quá trình đang thực hiện công việc (Hãy suy nghĩ về nó như quy trình giải nén).

[STAThread] 
static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new ConfigurationActionManagerForm()); 
} 

Cách tiếp cận this từ MSDN có đúng với đơn đăng ký của tôi không?

Trả lời

2

Tôi tìm thấy một giải pháp gọn gàng và đơn giản để thực hiện bằng cách sử dụng ví dụ trong câu hỏi của tôi được cung cấp bởi microsoft.

Tôi đã tạo lớp ngữ cảnh ứng dụng này chịu trách nhiệm cho mọi thứ trong ứng dụng và tôi sử dụng nó thay vì biểu mẫu trong Application.Run() như được hiển thị bên dưới. Để đạt được hành vi trong câu hỏi, tôi đang sử dụng biểu mẫu thứ hai bị ẩn và chỉ biểu tượng thanh tác vụ được hiển thị. Nếu người dùng muốn xem quy trình đang hoạt động như thế nào, họ có thể nhấp vào biểu tượng thanh tác vụ và xem cửa sổ ghi nhật ký, thực tế là ConfigurationApplierForm trong ví dụ dưới đây.

class AnApplicationContext: ApplicationContext 
{ 
private Form _currentForm; 

Lưu ý hàm tạo là riêng tư, chính nằm trong lớp này và được khai báo tĩnh.

private AnApplicationContext() 
{ 
    Application.ApplicationExit += new EventHandler(this.OnApplicationExit); 

    // choose which form to show based on arguments 
    if(Environment.GetCommandLineArgs().Contains("-apply")) 
    { 
     _currentForm = new ConfigurationApplierForm(); 
    } 
    else 
    { 
     _currentForm = new ConfigurationActionManagerForm(); 
    } 

    // initialize the form and attach event handlers 
    _currentForm.FormClosed += new FormClosedEventHandler(this.OnCurrentFormClosed); 
    _currentForm.ShowDialog(); 
} 

Chính ở đây, hơi khác so với bản gốc. Lưu ý đối số trong phương pháp Run

[STAThread] 
static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    // context is passed instead of a form 
    Application.Run(new AnApplicationContext()); 
} 

private void OnCurrentFormClosed(object sender, EventArgs e) 
{ 
    ExitThread(); 
} 

private void OnApplicationExit(object sender, EventArgs e) 
{ 
    /* is there anything to do when all forms are closed 
    and the application is going to die?*/ 
} 
} 

Ngoài ra, chúng tôi cần nói với dự án rằng đây là dự án khởi động.

Project Properties -> Application -> Startup Project 
3

Bạn có thể gọi Application.Run() mà không có cá thể biểu mẫu.

Bằng cách đó, nó sẽ bắt đầu vòng lặp tin nhắn mà không cần mở biểu mẫu.

Bạn có thể gọi MessageBox.Show() trước khi gọi .Run() cũng vậy.

Bạn thậm chí có thể tạo và mở biểu mẫu rồi gọi Run() mà không chỉ định đối số - điều đó có nghĩa là việc đóng biểu mẫu không tự động thoát khỏi ứng dụng.

Ví dụ:

 MessageBox.Show("Messaage!"); 

     Form1 f = new Form1(); 
     f.Show(); 

     Application.Run(); 

Như đã nêu ở trên, cách thực hiện Run() có nghĩa là đóng biểu mẫu không tự động đóng ứng dụng. Bạn cần xử lý điều này trong trình xử lý sự kiện Close của biểu mẫu. (Application.Exit())

MSDN trực tuyến có thể giúp bạn với điều này - kiểm tra mục trợ giúp cho Application.Run().

7

Bạn có ý giống như cách Visual Studio hoạt động không?

Nếu vậy thì bạn không thể thực hiện việc này trong ứng dụng Windows bình thường - Visual Studio cheats.

Vấn đề là ứng dụng Windows có thể là ứng dụng Windows Forms hoặc ứng dụng Console, nhưng không thể là cả hai - được quyết định tại thời gian biên dịch (đối với ứng dụng .Net trong cửa sổ thuộc tính dự án). lựa chọn của bạn là:

Hãy ứng dụng của bạn một ứng dụng Windows Forms

Trong trường hợp này # 1 và # 3 sẽ làm việc perfecty, nhưng đối với # 2 bạn sẽ thấy rằng bạn không thể đọc từ/ghi giao diện điều khiển (vì không có bảng điều khiển!).Nếu appliction của bạn không cần phải đưa ra bất cứ thông tin phản hồi thì đây có thể là tốt - làm việc của bạn như bình thường và chỉ không hiển thị một hình thức:

[STAThread] 
static void Main(string[] args) 
{ 
    if (args.Length > 0) 
    { 
     // Handle #2 here 
    } 
    else 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new ConfigurationActionManagerForm()); 
    } 
} 

Hãy ứng dụng của bạn một ứng dụng giao diện điều khiển

Trong trường hợp này # 2 sẽ hoạt động hoàn hảo, tuy nhiên # 1 và # 3 sẽ hoạt động tốt, bạn sẽ luôn có cửa sổ bảng điều khiển mở trong nền - nếu bạn đóng cửa sổ bảng điều khiển, ứng dụng của bạn sẽ kết thúc.

Một lần nữa điều này có thể là tốt, nhưng cá nhân tôi thấy đây là một hack.

Cheat (làm những gì Visual Studio Liệu)

Visual Studio lận bằng việc có 2 ứng dụng riêng biệt - một là một ứng dụng Console và người kia là một ứng dụng Windows Forms. Giải pháp dễ dàng là để nó ở đó và yêu cầu người dùng bắt đầu thực thi khác nhau khi chạy phiên bản dòng lệnh (ví dụ: myprogram_g.exemyprogram_w.exe).

Visual Studio sẽ tiến thêm một bước nữa và có một điểm vào, devenv. Nó thực hiện điều này bằng cách sử dụng thực tế là vì các lý do tương thích, vỏ Windows sẽ luôn chạy một tệp .com thay vì một .exe nếu có bất kỳ sự mơ hồ nào. Tất cả các phím tắt, vv .. trỏ đến tệp thực thi, nếu bạn chạy devenv trên dòng lệnh, ứng dụng devenv.com sẽ chạy thay vì sử dụng phép thuật để sắp xếp xem nó có chạy dưới dạng giao diện điều khiển hoặc ứng dụng cửa sổ hay không.

Lời khuyên của tôi là tạo hai ứng dụng khác nhau và để nó ở đó.

Xem How do I write a program that can be run either as a console or a GUI application? để biết thêm chi tiết (đảm bảo đọc nhận xét có đề xuất hữu ích bổ sung).

Đồng thời xem How to make an application as both GUI and Console application? để biết cách thực hiện ildasm.

1

Về cơ bản, bạn muốn có bảng điều khiển cho ứng dụng bằng một vài thay đổi.

Dưới đây là một ví dụ về làm thế nào để bắt đầu, hãy sử dụng một lớp aboutbox mặc định:

using System; 
using System.Windows.Forms; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      if (args.Length == 0) 
      { 
       Console.WriteLine("No Arguments"); 
      } 
      else 
      { 
       if (args[0] == "a") 
       { 
        Application.EnableVisualStyles(); 
        Application.SetCompatibleTextRenderingDefault(false); 
        Application.Run(new AboutBox1()); 

       } 
      } 

     } 
    } 
} 

Và AboutBox1 lớp:

using System.Reflection; 
using System.Windows.Forms; 

namespace ConsoleApplication1 
{ 
    partial class AboutBox1 : Form 
    { 
     public AboutBox1() 
     { 
      InitializeComponent(); 
      this.Text = String.Format("About {0} {0}", AssemblyTitle); 
      this.labelProductName.Text = AssemblyProduct; 
      this.labelVersion.Text = String.Format("Version {0} {0}", AssemblyVersion); 
      this.labelCopyright.Text = AssemblyCopyright; 
      this.labelCompanyName.Text = AssemblyCompany; 
      this.textBoxDescription.Text = AssemblyDescription; 
     } 

     #region Assembly Attribute Accessors 

     public string AssemblyTitle 
     { 
      get 
      { 
       object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false); 
       if (attributes.Length > 0) 
       { 
        AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0]; 
        if (titleAttribute.Title != "") 
        { 
         return titleAttribute.Title; 
        } 
       } 
       return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase); 
      } 
     } 

     public string AssemblyVersion 
     { 
      get 
      { 
       return Assembly.GetExecutingAssembly().GetName().Version.ToString(); 
      } 
     } 

     public string AssemblyDescription 
     { 
      get 
      { 
       object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false); 
       if (attributes.Length == 0) 
       { 
        return ""; 
       } 
       return ((AssemblyDescriptionAttribute)attributes[0]).Description; 
      } 
     } 

     public string AssemblyProduct 
     { 
      get 
      { 
       object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false); 
       if (attributes.Length == 0) 
       { 
        return ""; 
       } 
       return ((AssemblyProductAttribute)attributes[0]).Product; 
      } 
     } 

     public string AssemblyCopyright 
     { 
      get 
      { 
       object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false); 
       if (attributes.Length == 0) 
       { 
        return ""; 
       } 
       return ((AssemblyCopyrightAttribute)attributes[0]).Copyright; 
      } 
     } 

     public string AssemblyCompany 
     { 
      get 
      { 
       object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false); 
       if (attributes.Length == 0) 
       { 
        return ""; 
       } 
       return ((AssemblyCompanyAttribute)attributes[0]).Company; 
      } 
     } 
     #endregion 

     private void okButton_Click(object sender, EventArgs e) 
     { 
      Close(); 
     } 
    } 
} 
Các vấn đề liên quan