C# 怎么让Messagebox弹窗后,主窗口不能操作

lidaoying 2019-10-15 10:24:55
我的代码如下:软件一运行就开始定时执行Timer1_Elapsed内容,但是我发现定时执行弹窗对话框后,还能操作form1主窗口,我希望弹窗后不单击确定就不能操作主窗口,需要单击确认后再能操作主窗口

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

private void Form1_Load(object sender, EventArgs e)
{
System.Timers.Timer timer = new System.Timers.Timer();
timer.Enabled = true;
timer.Interval = 2000;//执行间隔时间,单位为毫秒
timer.Start();
timer.Elapsed += new System.Timers.ElapsedEventHandler(Timer1_Elapsed);
}

private void Timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{

MessageBox.Show("停止操作!", " fail", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Warning);


}
}
}
...全文
2282 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
Aries·Zhao 2019-10-28
  • 打赏
  • 举报
回复
直接ShowDialog
glb21 2019-10-25
  • 打赏
  • 举报
回复
楼主的代码得弹一堆messagebox吧
PLAisong 2019-10-23
  • 打赏
  • 举报
回复
窗体属性里面有这个 记不得找找看
xiaoxiangqing 2019-10-21
  • 打赏
  • 举报
回复
最好在主窗口里显示这个提示
E次奥 2019-10-18
  • 打赏
  • 举报
回复
总结一下:
1、多线程问题
2、没有使用模态窗体

以上两个条件都满足才能真正挡住主窗体
HerryDong 2019-10-18
  • 打赏
  • 举报
回复
首先你应该考虑一下为什么使用timer控件之后你的主窗体不会处于假死状态,很明显timer自带多线程机制,因此子线程无法影响主线程,至于解决方法,上面几楼都已经说了
qq_45701797 2019-10-18
  • 打赏
  • 举报
回复 1
引用 1 楼 Bridge_go 的回复:

        private void Timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            this.Invoke((MethodInvoker)delegate
            {
                MessageBox.Show("停止操作!", " fail", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Warning);

            });
        }
144
qq_45701797 2019-10-18
  • 打赏
  • 举报
回复
引用 5 楼 正怒月神 的回复:
#2正解,你自己begininvoke回去。
哈哈哈
秋的红果实 2019-10-18
  • 打赏
  • 举报
回复
#6正解 system.threading下还有个timer,一样是多线程的,需注意
wilson1966 2019-10-18
  • 打赏
  • 举报
回复
引用 9 楼 mytelo 的回复:
自定义一个消息显示窗体,form.ShowDialog()
没用的,因是不同执行线程,无法等show form Close
讲理&无赖 2019-10-18
  • 打赏
  • 举报
回复
普通框改成模态框
码上好玩 2019-10-18
  • 打赏
  • 举报
回复
前来学习学习
schlafenhamster 2019-10-18
  • 打赏
  • 举报
回复
typedef int (CALLBACK *MessageBoxTimeoutA)(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType, WORD wLanguageId, DWORD dwMilliseconds);


HINSTANCE gLib = LoadLibrary("user32.dll");
MessageBoxTimeoutA funcMsgTimeout = (MessageBoxTimeoutA)GetProcAddress(gLib,"MessageBoxTimeoutA");
funcMsgTimeout(m_hWnd,"timeout in 1 second!","MessageBoxTimeoutA",0,0,1000);
一个武术猴子 2019-10-18
  • 打赏
  • 举报
回复
begininvoke 强势回归给点分谢谢诶
mytelo 2019-10-17
  • 打赏
  • 举报
回复
自定义一个消息显示窗体,form.ShowDialog()
亚特兰蒂斯DE 2019-10-17
  • 打赏
  • 举报
回复
线程问题 注意 弄清楚执行代码是哪个线程执行的 这问题就好明白了 我初学的时候对这个印象深刻
以有涯求无涯 2019-10-17
  • 打赏
  • 举报
回复
同6楼,应使用 System.Windows.Forms.Timer,该控件会使用和UI线程,而你使用的那个控件会单开一个子线程,子线程的弹框自然无法阻塞主UI线程的操作。
datafansbj 2019-10-17
  • 打赏
  • 举报
回复
System.Timers.Timer 是在单独线程执行的,不是窗体 UI 线程,所以弹窗与你的窗体线程无关。 您应该使用 System.Windows.Forms.Timer。
正怒月神 2019-10-16
  • 打赏
  • 举报
回复
#2正解,你自己begininvoke回去。
github_36000833 2019-10-16
  • 打赏
  • 举报
回复
其实最好不要在定时器里弹窗。
加载更多回复(3)

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧