安装期间无法最小化或移动 Winform 窗口

Posted

技术标签:

【中文标题】安装期间无法最小化或移动 Winform 窗口【英文标题】:Not able to minimize or move Winform Window during installation 【发布时间】:2021-06-15 16:18:32 【问题描述】:

Winform Form Window (FixedDialog with toolbars) 提供安装和卸载应用程序的选项。 (Windows exe应用程序)

当用户点击安装/卸载按钮时,窗口既不能移动也不能最小化。 即,在为活动引发的事件未完成之前,它会卡住并且无法在表单窗口上执行任何操作。

添加事件如下,它们独立工作。 在form1.designer.cs中

         private void InitializeComponent(string defaultPath)
        
        //Other steps
        this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
        this.InstallButton.Click += new System.EventHandler(this.InstallButton_Click);
        this.UnInstallButton.Click += new System.EventHandler(this.UnInstallButton_Click);
        

例如。功能InstallButton_Click 有多个安装步骤,复制文件和完成其他工作大约需要半分钟。在此期间,它不允许移动或最小化窗口。 在form.cs中

private void InstallButton_Click(object sender, EventArgs e)

//Multiple steps for installation
//takes around 20-30 seconds to complete

这个问题类似于here 中提到的问题,但在那里看不到可接受的答案。

有没有办法让用户最小化或移动窗口?

【问题讨论】:

听起来您只是在阻止 UI。你是?显示事件处理程序。请参考minimal reproducible example。 @Sinatr,考虑到安装点击,它有安装步骤,其中涉及复制文件,大约需要 20-30 秒。在此期间不允许在窗口上进行任何活动。特别是阻止代码不是从我这边添加的。 InstallButton_Click() //安装步骤 // 如果加线程休眠应该可以生产 这能回答你的问题吗? WinForm Application UI Hangs during Long-Running Operation 轻松防止 UI 被阻止的“现代”方法是使用 asyncawait。 Duplicate 不幸的是没有这些,但它至少显示了几种方法。 Thread/BackgroundWorker/async-await 进一步可能的解决方案:***.com/a/36079335/5114784 【参考方案1】:

Here 有多种方法可供选择。

由于代码涉及更新GUI控件回来的一些步骤,无法直接使用解决方案。

由于几乎所有的解决方案都是基于asynchronous的原理,所以曾经抛出错误,Cross-thread operation not valid: Control 'InstallButton' accessed from a thread other than the thread it was created on.

为了避免它分离涉及 GUI 控制访问的步骤并执行它们sequentially,而剩余的独立代码使用Task.Run() 方法运行asynchronously。 GI 的执行时间可忽略不计

//Logic to update control
Task.Run(()=>

 //Remaining logic
);

【讨论】:

以上是关于安装期间无法最小化或移动 Winform 窗口的主要内容,如果未能解决你的问题,请参考以下文章

c# WINFORM窗体如何设置才可以不能随意拖动大小

如何在屏幕锁定或最小化浏览器期间禁用移动设备上的网页音频?

【C#】WinForm中如何让窗口最小化时直接最小化到托盘,后台运行

C#:当我尝试移动窗口、单击外部或最小化时,窗口挂起

winform 不想自动弹出窗口, 最小化後图标要显示在右下角 (像杀毒软件那样),要怎麼做?

WinForm 之 窗口最小化到托盘及右键图标显示菜单