对话框不会聚焦

时间:2012-07-13 07:14:36

标签: c#

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

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();

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

我该如何解决这个问题?谢谢。

6 个答案:

答案 0 :(得分:1)

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

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

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

void OnShown(object sender, EventArgs e) {
   SetForegroundWindow(this.Handle);
} 

答案 1 :(得分:1)

loginDialog.TopMost = true;

之前使用loginDialog.ShowDialog();

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

答案 2 :(得分: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()始终位于执行它的父窗体的顶部。

此致

答案 3 :(得分:0)

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

答案 4 :(得分: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变量是什么。

答案 5 :(得分:0)

你说你是从另一种形式呼叫ShowLoginDialog()。您可以将签名更改为public static bool ShowLoginDialog(Form parentForm)public 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
    }
}