Backgroundworker无法执行

G-Oker

新成员
已加入
2021年1月21日
留言内容
3
编程经验
1-3
您好,
我正在尝试一个消息框"click"回车键(如果在指定时间内保持打开状态)。
我可以使用计时器来完成此操作,但是问题是,如果在该时间段内有用户输入,则关键仍然是"pushed"计时器(注意:这应该不成问题,因为应用程序上没有其他应按Enter键的问题。
因为它更加整洁,并且出于谨慎的考虑而出错,所以我试图让背景工作人员来代替它,但是我无法解雇/执行。

这里有人可以查看我的代码并指出我在做什么/可能做错了吗?

C#:
            private void timer1_Tick(object sender, EventArgs e)
                {
                timer1.Enabled = false;
                SendKeys.Send("{ENTER}"); // SendWait as alternative
                }
                
                        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
                {
    
                //timer1.Interval = 10000;
                //timer1.Enabled = true;
                backgroundWorker1.RunWorkerAsync();
    
                if (MessageBox.Show("Are you sure you want to close?", "Leave ? ", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                    {
                    e.Cancel = false;
                    }
                else
                    {
                    e.Cancel = true;
                    }
                }
    
            private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
                {
                Thread.Sleep(5000);
                SendKeys.Send("{ENTER}"); //or Esc
                }

谢谢。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
您是否在第27行上设置了一个断点,以真正向自己证明后台工作者没有运行?

Or is the issue really that the background worker is working, but the SendKeys() is not actually sending the Enter key to the UI thread?
 

G-Oker

新成员
已加入
2021年1月21日
留言内容
3
编程经验
1-3
您是否在第27行上设置了一个断点,以真正向自己证明后台工作者没有运行?

Or is the issue really that the background worker is working, but the SendKeys() is not actually sending the Enter key to the UI thread?
谢谢你的回复  :)

不,我没有设置断点,我编译了代码,并打开了信息框,但它仍然保持打开状态。不过,您提出了一个问题,我将在这里尝试一些操作,看看它是否正在触发,如果sendkey不起作用。谢谢
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,028
地点
挪威
编程经验
10+
这种方法会给您带来各种麻烦。对于带有超时的MessageBox,我喜欢这里的帖子之一: 几秒钟后关闭MessageBox
代码如下:
C#:
var autoclose = false;
var w = new Form() { Size = new Size(0, 0) };
Task.Delay(TimeSpan.FromSeconds(3))
    .ContinueWith((t) => { w.Close(); autoclose = true; }, TaskScheduler.FromCurrentSynchronizationContext());

var result = MessageBox.Show(w, "Are you sure you want to close?", "Leave ? ", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
e.Cancel = !autoclose && result == DialogResult.No;
An owner window is created and a Task used to close it. The dialog will automatically close if the owner is closed first. Dialog result will be No if that happens, so I added a variable to see if timeout happened and use that in e.Cancel expression. The logic is kind of inverted here since true cancels closing :翻白眼:
 

G-Oker

新成员
已加入
2021年1月21日
留言内容
3
编程经验
1-3
这种方法会给您带来各种麻烦。对于带有超时的MessageBox,我喜欢这里的帖子之一: 几秒钟后关闭MessageBox
代码如下:
C#:
var autoclose = false;
var w = new Form() { Size = new Size(0, 0) };
Task.Delay(TimeSpan.FromSeconds(3))
    .ContinueWith((t) => { w.Close(); autoclose = true; }, TaskScheduler.FromCurrentSynchronizationContext());

var result = MessageBox.Show(w, "Are you sure you want to close?", "Leave ? ", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
e.Cancel = !autoclose && result == DialogResult.No;
An owner window is created and a Task used to close it. The dialog will automatically close if the owner is closed first. Dialog result will be No if that happens, so I added a variable to see if timeout happened and use that in e.Cancel expression. The logic is kind of inverted here since true cancels closing :翻白眼:
主席先生,您是STAR。这很完美。非常感谢你
 
最佳 底部