0

ソフトウェアのライセンスを監視するタイマー クラスを作成しました。エラーが発生したら、ShowDialog() を呼び出して、カスタマイズした Windows フォームを表示します。私の問題は、親ウィンドウを無効にするにはどうすればよいですか? これが私の問題の簡単な例です。ご覧のとおり、MessageBox がポップアップしても、MainForm ウィンドウから入力できます。

MainForm1.cs ファイル

using System;  
using System.Collections.Generic;  
using System.ComponentModel;  
using System.Data;  
using System.Drawing;  
using System.Linq;  
using System.Text;  
using System.Windows.Forms;  

namespace TestProject  
{  
    public partial class MainForm1 : Form  
    {  
        public MainForm1()  
        {  
            InitializeComponent();  
        }  

        private void MainForm1_Load(object sender, EventArgs e)  
        {  
            TimerClass1 timer = new TimerClass1();  
        }  
    }  
}  

MessageBox.cs ファイル

using System;  
using System.Collections.Generic;  
using System.ComponentModel;  
using System.Data;  
using System.Drawing;  
using System.Linq;  
using System.Text;  
using System.Windows.Forms;  

namespace TestProject  
{  
    public partial class MessageBox : Form  
    {  
        public MessageBox()  
        {  
            InitializeComponent();  
            this.label1.Text = "Hello There";  
            this.button1.Text = "OK";  
            this.button1.DialogResult = System.Windows.Forms.DialogResult.OK;  
        }  
    }  
}  

TimerClass1.cs ファイル

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Timers;  
using System.Windows;  

namespace TestProject  
{  
    class TimerClass1  
    {  
        Timer _timer;  
        public TimerClass1()  
        {  
            _timer = new Timer(1);  
            _timer.Elapsed +=new ElapsedEventHandler(_timer_Elapsed);  
            _timer.Enabled = true;  
        }  

        private void _timer_Elapsed(object sender, ElapsedEventArgs e)  
        {  
            _timer.Stop();  
            MessageBox msg = new MessageBox();  
            msg.ShowDialog();  
            _timer.Start();  
        }  
    }  
}  
4

4 に答える 4

2

別のスレッドで表示MessageBoxしているため、メイン ウィンドウのモーダル ダイアログとして表示されません。メイン UI スレッドで表示する必要があります。

    private void _timer_Elapsed(object sender, ElapsedEventArgs e)  
    {  
        _timer.Stop();  
        Application.Current.Dispatcher.Invoke(new Action(
        () => {
            MessageBox msg = new MessageBox();  
            msg.ShowDialog();  
        }));
        _timer.Start();  
    }  
于 2012-08-14T20:29:47.893 に答える
1

これを修正するには、次のように変更します。

TimerClass1.cs ファイル

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
//using System.Timers;  
using System.Windows;  

次に、Windows.Forms.Timer (必要なもの) への切り替えによって発生したエラーを修正します。

于 2012-08-14T20:30:44.787 に答える
0

TimerClass1 から MainForm1 にアクセスするには何らかの方法が必要です。これが完了したら、フォーム自体またはフォーム上のコントロールを無効にするメソッドを MainForm1 で作成して呼び出すことができます。

于 2012-08-14T20:27:20.913 に答える
0

親フォームをパラメーターとしてタイマーに送信し、次のようにダイアログを表示すると、うまくいくはずです。

MainForm1.csファイル

TimerClass1 timer = new TimerClass1(this);

TimerClass1.csファイル

..
private Form ParentForm {get; set;}
..
public TimerClass1(Form parentForm)           
{
..
this.ParentForm = parentForm;
..   
}
..
private void _timer_Elapsed(object sender, ElapsedEventArgs e)           
{
..
 msg.ShowDialog(this.ParentForm);
..
} 
.. 
于 2012-08-14T20:39:13.427 に答える