解决Winform程序loading框导致程序窗口层级改变的问题
之前项目中有耗时的提交操作用到了Loading框,在点击提交后弹出loading框显示gif图片,表示程序正在处理中,处理完成后弹出messagebox提示提交成功。问题出现在这里,如果此时开着其他程序的话,当前程序后在点击messagebox的确认后“最小化”,实际上就是隐藏于其他窗口之后。排查这个问题用了很长时间,最后发现问题所在:弹出的loading框是一个单独的线程,且设置了topmost=true,等loading框自己关闭后弹出的messagebox并不知道此时应该显示在哪个程序的前面,因此有可能把其他开着的窗体当成了弹出messagebox的对象,从而导致我的程序“最小化”。
解决这个问题我做了两处改动:
1.在弹出loading框,通过Windows API GetForegroundWIndow获取我的程序的句柄,然后在loadding消失后通过SetForegroundWindow API把之前得到的句柄传入,确保我的窗体一直是保持在最前端。
2.弹出messagebox时,传入我的窗体的句柄 MessageBox.Show(this,“显示内容”),确保提示框显示在我的程序的前面。
这样最终解决了问题。
在实际测试中发现操作下来程序会偶尔有一下闪烁,就是窗体被置到其他窗口下又强行“拉”回来的表现,关于这个现象的优化,还有待继续改进。
-------原创内容,转载请注明出处。