【问题标题】:C# Add Windows Form Application To A Console ApplicationC# 将 Windows 窗体应用程序添加到控制台应用程序
【发布时间】:2016-12-19 03:40:19
【问题描述】:

我有一个控制台应用程序在后台做一些事情,我想让它让用户可以更改控制台应用程序正在做的一些事情。

我想添加一个 Windows 窗体应用程序来获取用户输入并将其发送到控制台应用程序以供使用。我已经找过了,但找不到我要找的东西

我发现了这个问题 - Add GUI to Existing Code in Visual Studio - 但这对我没有多大帮助。

我有这个:

bool OnOrOff = true; 

但我想检查是否选中了 windows 窗体中的复选框,而不是像这样将其设置为 true:

在 Windows 窗体上,复选框被命名为 CheckOnOrOff 并且它被选中。

bool OnOrOff = CheckOnOrOff.Checked();

【问题讨论】:

  • @Rob 是的,但在控制台应用程序中,所以如果选中复选框的表单之一,那么我想将其发送到控制台应用程序。
  • @Rob 但是怎么做?就像在示例中一样,我不能只调用 CheckOnOrOff.Checked() 因为它无法识别。我有 windows 窗体作为对控制台应用程序的引用。

标签: c# windows forms console


【解决方案1】:

我假设用户可以在控制台应用程序运行时更改设置,并且应该立即生效。在控制台中添加您的 winforms 应用程序作为参考将无济于事,因为它将是一个不同的应用程序。所以这就是我的建议:

  1. 创建一个新的 winforms 应用程序并将输出类型从“Windows 应用程序”更改为“控制台应用程序”,以便我们可以看到控制台。将控制台逻辑进程移植到 winforms 项目

  2. 添加一个新的静态类,它将在 winforms 和控制台之间保存标志。示例:

namespace FormWithConsole {
    public static class SharedData {
        public static bool Feature01 { get; set; }
    }
}
  1. 在您的 Windows 窗体中添加一个复选框,并将下面的代码添加到复选框更改事件中:

private void checkBox1_CheckedChanged(object sender, EventArgs e) {
    SharedData.Feature01 = checkBox1.Checked;
}
  1. 添加一个按钮来启动您的控制台进程,并使用线程来启动您的控制台进程,如下所示:

Thread thread;
 private void button1_Click(object sender, EventArgs e) {
    if (thread != null) {
        try {
            Console.WriteLine("Aborting current process");
            thread.Abort();
            thread = null
        }
        catch (ThreadAbortException) { }
    }
    ConsoleProcess process = new ConsoleProcess();
    thread = new Thread(process.StartProcess);
    thread.IsBackground = true;
    thread.Start();
}
  1. 这是 ConsoleProcess 类,用于保存您的控制台逻辑

class ConsoleProcess {
     public void StartProcess() {
         while (true) {
             if (SharedData.Feature01) {
                 // Do something here
             }
             Console.WriteLine("Regular process here...");
         }
     }
 }

如果您想将表单最小化到系统托盘,请参阅minimize app to system tray

【讨论】:

    【解决方案2】:

    我认为您应该设计一个数据库来存储用户输入。您的控制台项目和窗口项目将由该数据库运行和管理。

    【讨论】:

      【解决方案3】:

      您可以从 Windows 窗体(由用户)获取输入,然后通过使用控制台应用程序中的参数参数将其传递给控制台应用程序。

      Main方法的参数是一个String数组,表示命令行参数

      所以,如果我有一个像这样的控制台程序 (MyCApp.exe):

      class Program
      {
        static void Main(string[] args)
        {
          foreach (var arg in args)
          {
            Console.WriteLine(arg);
          }
        }
      }
      

      我从命令行开始是这样的:

      MyCApp.exe Arg1 Arg2 Arg3 Main 方法将传递一个数组 包含三个字符串:“Arg1”、“Arg2”、“Arg3”。

      如果您需要传递包含空格的参数,请将其括在引号中。例如:

      MyCApp.exe "Arg 1" "Arg 2" "Arg 3" 当您需要在运行时将信息传递给应用程序时,通常会使用命令行参数。例如,如果您正在编写一个传递基本信息以将文件从一个位置复制到另一个位置的程序,您可能会将这两个位置作为命令行参数传递。例如:

      MyCApp.exe C:\file1.txt C:\file2.txt Copyit
      

      这里 'C:\file1.txt' 是第一个参数,'C:\file2.txt' 是第一个参数,'Copyit' 是第三个参数

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多