0

写了一个登录自定义对话框

static LoginDialog loginDialog;

public static bool ShowLoginDialog()
        {
            result = false; // Success

            loginDialog = new LoginDialog();

            loginDialog.ShowDialog();
            loginDialog.BringToFront();
            loginDialog.TopMost = true;
            loginDialog.Activate();

            return result;
        }

我在没有交互的情况下从另一种形式调用它,它在计时器滴答时启动:

LoginDialog.ShowLoginDialog();

问题是登录屏幕没有集中在当前打开的表单之上。

我怎么解决这个问题?谢谢你。

4

6 回答 6

1

使用loginDialog.TopMost = true;loginDialog.ShowDialog();

为什么要使用静态方法?我认为这是主要问题。

于 2012-07-14T04:29:46.613 回答
1

在要获得焦点的表单内使用 SetForegroundWindow

[DllImport("user32")] 
public static extern int SetForegroundWindow(IntPtr hwnd); 

并且当显示对话框表单时,使用表单句柄调用该函数;

void OnShown(object sender, EventArgs e) {
   SetForegroundWindow(this.Handle);
} 
于 2012-07-13T07:34:11.077 回答
0
//Suppose you have Form1  as your parent Form
//Add Button on it and on its Click Event

只需执行以下操作:

public bool ShowLoginDialog()
    {
        bool result = false; // Success

        var  loginDialog = new LoginDialog();
        loginDialog.ShowDialog();

        return result;
    }

ShowDialog() 始终位于执行它的父窗体的顶部。

问候

于 2012-07-13T07:28:48.223 回答
0

我假设您LoginDialog只是另一种形式。尝试这个 -

MainForm

private void MainForm_Load(object sender, EventArgs e)
    {
        timer1.Interval = 3000; // your preferred time-interval
        timer1.Start();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        LoginDialog.ShowLoginDialog(timer1);
    }  

LoginDialog

    private static bool result;
    private static LoginDialog loginDialog;

    public static bool ShowLoginDialog(Timer timer)
    {
        timer.Stop();

        result = false; // Success

        loginDialog = new LoginDialog();
        loginDialog.ShowDialog();

        return result;
    }  

注意:我不知道result您使用的变量是什么。

于 2012-07-13T08:12:13.227 回答
0

你说你是ShowLoginDialog()从另一种形式调用的。您可以将您的签名更改为public static bool ShowLoginDialog(Form parentForm)orpublic static bool ShowLoginDialog(IWin32WindowOwner parentForm)吗?如果是这样,那么你可以这样做:

public static bool ShowLoginDialog(IWin32WindowOwner parentForm)
{
    using(LoginDialog loginDialog = new LoginDialog()) //Really should use using statement
    {
        loginDialog.ShowDialog(parentForm); //Set the parent form for the dialog
    }
}
于 2012-07-14T04:34:53.973 回答
0

loginDialog.BringToFront(); 不会因为 ShowDialog() 阻止执行而被调用。将所有者表单传递给 ShowDialog。

于 2012-07-13T07:45:56.460 回答