【问题标题】:When closing my app, it remains in background关闭我的应用程序时,它仍处于后台
【发布时间】:2021-06-01 07:55:26
【问题描述】:

我在 C# VIsual Studio 2019 中创建了一个简单的自动点击器,当我打开它然后用右上角的红色 X 关闭它时,它仍然在后台(我可以在任务管理器中看到它)。 我试图用代码制作一个按钮:

private void button2_Click(object sender, EventArgs e)
{
    Application.Exit();
}

但它仍然不起作用。有什么帮助吗?

这里是完整的代码:

public partial class Form1 : Form
{
    [DllImport("user32.dll")]
    static extern short GetAsyncKeyState(Keys vKey);

    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
    public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);

    private const int LEFTUP = 0x0004;
    private const int LEFTDOWN = 0x0002;
    public int intervals = 100;
    public bool Click = false;
    public int parsedValue;
    
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        CheckForIllegalCrossThreadCalls = false;
        Thread AC = new Thread(AutoClick);
        backgroundWorker1.RunWorkerAsync();
        AC.Start();
    }

    private void AutoClick()
    {
        while (true)
        {
            if(Click == true)
            {
                mouse_event(dwFlags: LEFTUP, dx: 0, dy: 0, cButtons: 0, dwExtraInfo: 0);
                Thread.Sleep(1);
                mouse_event(dwFlags: LEFTDOWN, dx: 0, dy: 0, cButtons: 0, dwExtraInfo: 0);
                Thread.Sleep(intervals);
            }
            Thread.Sleep(2);
        }
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        while (true)
        {
            if (checkBox1.Checked)
            {
                if(GetAsyncKeyState(Keys.Down)< 0)
                {
                    Click = false;
                }
                else if(GetAsyncKeyState(Keys.Up)< 0)
                {
                    Click = true;
                }
                
                Thread.Sleep(1);
            }
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if(!int.TryParse(textBox1.Text, out parsedValue))
        {
            MessageBox.Show("Enter a number");
            return;
        }
        else
        {
            intervals = int.Parse(textBox1.Text);
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {
        Application.Exit();
    }
}

【问题讨论】:

标签: c#


【解决方案1】:

在您的代码中,未正确关闭的主要原因是您在后台运行的线程在退出之前没有停止,请应用以下更改以使其严格关闭

  • 要么让线程意识到应用程序正在停止(困难但有效的方法)
  • 让线程在应用退出时自动终止(简单的方法)
  • 在应用退出时强制所有东西立即关闭(简单但不推荐,残忍的方法)

要使第一种方法工作,请在无限循环中使用标志而不是硬编码 true,例如

private void AutoClick()
{
            
    while (!this.isExiting) //set this variable to true before calling Application.Exit()
    {
         if(Click == true)
         {
            mouse_event(dwFlags: LEFTUP, dx: 0, dy: 0, cButtons: 0, dwExtraInfo: 0);
            Thread.Sleep(1);
            mouse_event(dwFlags: LEFTDOWN, dx: 0, dy: 0, cButtons: 0, dwExtraInfo: 0);
            Thread.Sleep(intervals);
          }
          Thread.Sleep(2);
    }
}

对于第二种工作方法,将线程的 IsBackground 属性设置为 true,以便它在应用退出时自动停止,例如

private void Form1_Load(object sender, EventArgs e)
{
     CheckForIllegalCrossThreadCalls = false;
     Thread AC = new Thread(AutoClick);
     AC.IsBackground = true; //this will let thread close automatically on app exit
     AC.Start();
     backgroundWorker1.RunWorkerAsync();
}

对于第三种工作方式,只需致电 Environment.Exit(Environment.ExitCode); 而不是 Application.Exit(),例如

private void button2_Click(object sender, EventArgs e)
{
     //Application.Exit(); do not use this
     Environment.Exit(Environment.ExitCode); //this will forcely close everything started by your app
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-02
    • 2021-05-17
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    相关资源
    最近更新 更多