作为任务调度程序运行的窗口c#应用程序

本文关键字:窗口 应用程序 运行 任务调度程序 | 更新日期: 2023-09-27 18:08:43

我有一个带有一个按钮的windows应用程序,并希望它是自动的,即runas任务调度程序,而不是手动按下按钮。当我这样做的时候,我得到了这个错误。

索引超出了数组的边界。

这是我的代码。

private void button1_Click(object sender, EventArgs e)
{
    this.Process1();
}
public void Process1()
{
    dialog = new SaveFileDialog();
    dialog.Title = "Save file as...";
    dialog.Filter = "XML Files (*.xml)|*.xml";
    dialog.RestoreDirectory = true;
    //dialog.InitialDirectory = @"v:'";
    //blah blah blah...... code here..
}

p * * rogram.cs * *

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    //Application.Run(new Form1());
    Form1 form = new Form1();
    String[] arguments = Environment.GetCommandLineArgs();
    if (arguments.Count() >= 1) 
    {
        // next line shows up the error
        Int16 valueArgument = Int16.Parse(arguments[1]);// <--- 
        switch(valueArgument)
        {
            case 1 :
                form.Process1();
                break;      
        }
    }
    // ...

这在另一个有11个按钮的应用程序上工作。这里我只有一个按钮可以运行,但失败了。

作为任务调度程序运行的窗口c#应用程序

如果你有一个参数,那么arguments[1]将不存在。要获得第一个参数,请使用arguments[0]

正如@ActiveHigh在注释中指出的那样,第一个参数将始终是正在执行的程序的文件名(参见环境中的备注部分)。GetCommandLineArgs文档。

这意味着您没有传递命令行参数。它还建议您应该将参数计数检查更新为> 1而不是>= 1,因为该条件将始终为真。

您的程序有许多错误。我已经尽可能多地指出了-

  1. Windows Form Application不像Console Application那样工作。对于控制台,一旦退出Main,程序就会退出。这就是现在在代码中发生的事情。对于windows窗体应用程序无限期地运行,您必须从Application.Run获得帮助,我看到您已经注释了。

  2. 第二个错误是-

    String[] arguments = Environment.GetCommandLineArgs();, arguments是一个数组,所以它没有Count()方法。你应该使用arguments.Length

  3. 你必须调用ShowDialog来显示对话框

如果你想让某些东西工作,你至少要解决这个问题。与其使用main方法,不如将所有参数传递给form,然后在form中做任何你想做的事情-

表单-

    public Form1()
    {
        InitializeComponent();
        this.Shown += (s, e) => {
            String[] arguments = Environment.GetCommandLineArgs();
            if (arguments.Length > 1)
            {
                Int16 valueArgument = Int16.Parse(arguments[1]); 
                switch (valueArgument)
                {
                    case 1:
                        this.Process1();
                        break;
                }
            }
        };
    }
    private void button1_Click(object sender, EventArgs e)
    {
        this.Process1();
    }
    public void Process1()
    {
        var dialog = new SaveFileDialog();
        dialog.Title = "Save file as...";
        dialog.Filter = "XML Files (*.xml)|*.xml";
        dialog.RestoreDirectory = true;
        dialog.ShowDialog(this);
        //dialog.InitialDirectory = @"v:'";
        //blah blah blah...... code here..
    }

And the Program.cs -

static class Program
{
    [STAThread]
    static void Main()
    {
        var handleCreated = new ManualResetEvent(false);
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}

还要注意-应用程序。Run是阻塞调用。编写的任何代码After this调用只会在被调用的表单退出后执行。