gpt4 book ai didi

c# - 从线程关闭对话框

转载 作者:行者123 更新时间:2023-11-30 22:00:36 25 4
gpt4 key购买 nike

我有一个在 C# Windows 窗体下运行的应用程序。当用户退出应用程序时,我想建议用户关闭计算机。我的应用程序有点复杂,但以下是我的问题的一个很好的例子:

public partial class Form1 : Form
{
public class shell32
{
[DllImport("shell32", EntryPoint = "#60")]
private static extern int SHShutDownDialog(long p);

public static void ShutDownDialog()
{
int x = SHShutDownDialog(0);
}
}

private Thread _eventHandler;
private System.Windows.Forms.Button btnShutDown;

public Form1()
{
InitializeComponent();

AddSDButton();
SetAndStartThread();
}

private void AddSDButton()
{
this.btnShutDown = new System.Windows.Forms.Button();
this.SuspendLayout();
this.btnShutDown.Location = new System.Drawing.Point(50, 50);
this.btnShutDown.Name = "btnShutDown";
this.btnShutDown.Size = new System.Drawing.Size(75, 25);
this.btnShutDown.TabIndex = 0;
this.btnShutDown.Text = "Shut Down";
this.btnShutDown.UseVisualStyleBackColor = true;
this.btnShutDown.Click += new System.EventHandler(this.btnShutDown_Click);

this.Controls.Add(this.btnShutDown);
}

private void SetAndStartThread()
{
_eventHandler = new Thread(new ThreadStart(this.EventHandler));
_eventHandler.IsBackground = true;
_eventHandler.Start();
}

protected void EventHandler()
{
try
{
while (true)
{
//DO SOMETHING..
Thread.Sleep(5000);
shell32.ShutDownDialog();
}
}
catch (ThreadAbortException)
{
return;
}
}

private void btnShutDown_Click(object sender, EventArgs e)
{
shell32.ShutDownDialog();
}

}

使用 btnShutDown_Click 通过表单调用关闭对话框效果很好。但是,正在运行的线程无法调用 shell32.ShutDownDialog。 SHShutDownDialog 返回一个负值。有什么想法吗?

最佳答案

您不能让后台线程访问 UI。 UI 必须始终在其自己的线程上运行。您的后台线程需要向主线程发送一条消息,要求主线程打开对话框。

关于如何实现这种跨线程异步消息传递的信息,参见这个问题:

How to post a UI message from a worker thread in C#

关于c# - 从线程关闭对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28412125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com