Почему я не могу закрыть свой исполняемый файл JAR таким образом? - PullRequest
1 голос
/ 10 мая 2019

Я написал программу, которая требует, чтобы я открывал и закрывал исполняемый файл JAR.На данный момент у меня есть код, который может открыть банку с конкретными аргументами (я использовал блокнот в примере кода, так как у меня нет файла Jar или моего исходного кода, и мне нужно было протестировать то, что я написал для этого примерасработало) У меня проблема в том, что когда я открываю и закрываю блокнот, я получаю правильное поведение, однако, когда я пытаюсь закрыть свой файл JAR, я не получаю ответ.

Я попытался убить по имени процесса в диспетчере задач - перейдите к деталям, названию приложения и вариантам java, java.exe, javaw и т. Д.

Это как-то связано сзапустив банку через CMD?в этом случае у меня возникает другая проблема, потому что у меня есть несколько процессов с одинаковым именем, и я не уверен, как получить идентификатор, если имя совпадает.

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
    {
        // Click on the link below to continue learning how to build a desktop app using WinForms!
        System.Diagnostics.Process.Start("http://aka.ms/dotnet-get-started-desktop");

    }


    //string jarFile = "/JarLocation";
    //string jsonlocation = "/jsonlocation";
    //string command = $"java - jar {jarfile} -qsArgs {jsonLocation}";
    string command = "Notepad";
    string processName = "Notepad";
    List<int> processIDs = new List<int>();
    int[] processID;

    Thread testThread;
    ThreadStart ts;

    private void RunButton_Click(object sender, EventArgs e)
    {
        MessageBox.Show("Running!");

        // METHOD 1     // Launch through CMD directly (in a new thread and try to terminate by process name)     
        /*
        new Thread(() =>
        {
            LaunchClient();
        }).Start();
        */


        // METHOD 2 // Generate 
        /*
        foreach (int ID in processIDs)
        {
            Console.WriteLine($"Process {ID} Created");
        }
        */

        //Method 3
        /*
        testThread = new Thread(new ThreadStart(LaunchClient()));
        //testThread.Start();
        */

        // Method 4
        ts = delegate { LaunchClient(); };



    }

    private void KillButton_Click(object sender, EventArgs e)
    {
        MessageBox.Show("Killing!");
        try
        {
            // Method 1

            Process[] ProcList = Process.GetProcessesByName(processName);
            foreach (Process targetProc in ProcList)
            {
                targetProc.CloseMainWindow();
            }



            // Method 2
            /*
            foreach (int ID in processIDs)
            {
                Process killMe = Process.GetProcessById(ID);
                killMe.CloseMainWindow();
            }
            */

            // Method 3
            //testThread.Abort();

            //Method 4
            //ts.EndInvoke();

        }
        catch (Exception f)
        {
            Console.WriteLine("f.StackTrace");
        }
    }

    public void LaunchClient()
    {
        Thread.CurrentThread.IsBackground = false;
        Process proc = new Process();
        proc.StartInfo.FileName = "cmd.exe";
        proc.StartInfo.CreateNoWindow = true;
        proc.StartInfo.RedirectStandardInput = true;
        //proc.StartInfo.RedirectStandardOutput = true;
        proc.StartInfo.UseShellExecute = false;
        proc.Start();
        proc.StandardInput.WriteLine(command);
        proc.StandardInput.Flush();
        Console.WriteLine($"PROCESS ID: {proc.Id}");
        processIDs.Add(proc.Id);
        //proc.StandardInput.Close();
        proc.WaitForExit();
    }

}

Извините, что выкинул большой кусок кода, но я подумал, что моя реализация открытия и закрытия может помочь.

РЕДАКТИРОВАТЬ:

ОбновилПример кода приведен, чтобы показать 4 различных способа, которыми я пытался справиться с этим.

Method 1: 
Closing process by name (works for notepad, but not my jar)
2: Trying to pass the process ID back and use that to close the process 
(Cant see the ID outside of the thread running the cmd window)
3: using new threadstart (launchclient says 'method name expected')

4:  Doesn't open Notepad at all. 

1 Ответ

0 голосов
/ 10 мая 2019

Если ваш JAR-файл открыт с вашим кодом, полезной техникой является прослушивание windowClosing, которое происходит, когда пользователь нажимает кнопку X в Windows (и эквивалент в других системах):

   addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
          System.exit(0);
      }
   });
...