Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何限制用户在响应当前窗体之前访问父窗体_C#_.net_Visual Studio - Fatal编程技术网

C# 如何限制用户在响应当前窗体之前访问父窗体

C# 如何限制用户在响应当前窗体之前访问父窗体,c#,.net,visual-studio,C#,.net,Visual Studio,我正在尝试设计一个简单的许可证密钥客户端程序,用户在激活其软件之前无法访问父窗体,我似乎无法阻止他们单击父窗体并与之交互。我不想使用Form.ShowDialog(),因为如果用户尚未声明其许可证密钥,我希望同时打开这两个对话框。你有没有想过我该如何做到这一点 编辑:这是我的MainApp构造函数: public MainApp() { InitializeComponent(); MySqlConnection conn; this.

我正在尝试设计一个简单的许可证密钥客户端程序,用户在激活其软件之前无法访问父窗体,我似乎无法阻止他们单击父窗体并与之交互。我不想使用Form.ShowDialog(),因为如果用户尚未声明其许可证密钥,我希望同时打开这两个对话框。你有没有想过我该如何做到这一点

编辑:这是我的MainApp构造函数:

  public MainApp()
    {
        InitializeComponent();
        MySqlConnection conn;
        this.FormClosing += new FormClosingEventHandler(MainApp_FormClosing);
        string connString = "";
        string sql = String.Format("SELECT COUNT(*) FROM license_keys WHERE hwid='{0}';", ComputerInfo.GetComputerId());
        using (conn = new MySqlConnection(connString))
        {
            conn.Open();
            using (MySqlCommand cmd = new MySqlCommand(sql, conn))
            {
                var result = Convert.ToInt32(cmd.ExecuteScalar());
                if (result == 0)
                {
                    AuthTest authTest = new AuthTest();
                    authTest.ShowDialog(this);
                    authTest.BringToFront();
                }
            }
        }
    }
问题是,如果SQL查询没有返回任何内容,我希望两个表单都打开,但我希望主表单(此类)仍然显示,但如果用户在响应AuthTest表单之前尝试与它交互,则会向用户发出警告(声音和闪烁)


请注意,这只是一个概念证明,我理解代码并不好。

您需要指定父窗口。有一个重载接受
IWin32Window

首先,您需要在窗口存在的位置执行此操作,如
Load
事件处理程序,而不是构造函数。因为默认情况下窗口还不可见,所以在显示模式对话框之前,需要调用
Show
使其可见

this.Show();
AuthTest AuthTest=新的AuthTest();
authTest.ShowDialog(此);//假设“this”是主窗口实例。
如果
this
不是该上下文中的主窗口实例,则需要将可行的父级传递给任何方法


authTest.BringToFront
的调用在对话框被取消之前不会执行,因此您不需要它。

这就是
ShowDialog
的用途,因此如果您得到的结果不是这样,那么您就错用了它。如果没有代码,我们无法帮助您确定需要修复的内容。@madreflection编辑了文章以包含逻辑。不要在工作线程上显示UI。结果比一个非模态的对话要糟糕得多。是的,我已经看到了这个答案,并且试过了。问题是,程序仍然首先打开AuthTest窗体,然后仅在关闭AuthTest窗体后才打开主窗体。那么,该程序在哪里运行?建造师?表单加载?请显示更多的类。它在构造函数中运行。它需要在
Load
事件处理程序中完成,您需要调用
this。首先显示
。当构造函数运行时,窗口(HWND)还不存在,因此无法在此时显示。