Подтвердить что ты не робот

Как я могу перенести окно приложения на передний план?

Как перенести окно приложения на передний план? Например, мое приложение нуждается в внимании.

Это для моей личной программы. Мне нужна эта функциональность.

Это то, что я получил. Но он НЕ работает 100% раз.

public void BringToFrontToEnterCaptha()
{
    if (InvokeRequired)
    {
        Invoke(new Action(BringToFrontToEnterCaptha));
    }
    else
    {
        this.TopMost = true;
        this.Focus();
        this.BringToFront();
        this.textBox1.Focus();
        this.textBox1.Text = string.Empty;
        System.Media.SystemSounds.Beep.Play();
    }
}

public void BringToBackAfterEnterCaptha()
{
    if (InvokeRequired)
    {
        Invoke(new Action(BringToBackAfterEnterCaptha));
    }
    else
    {
        this.TopMost = false;
    }
}

И я вызываю их из фонового рабочего.

BringToFrontToEnterCaptha();
while (!ready)
{
    Thread.Sleep(100);
}
BringToBackAfterEnterCaptha();
Thread.Sleep(300);

И после нажатия кнопки "Принять" bool ready имеет значение true.

Я отлично работаю, но не всегда.

4b9b3361

Ответ 2

Вот фрагмент кода, который работал у меня

this.WindowState = FormWindowState.Minimized;
this.Show();
this.WindowState = FormWindowState.Normal;

Он всегда выводит нужное окно перед всеми остальными.

Ответ 3

Пока я согласен со всеми, это нехорошее поведение, вот код:

[DllImport("User32.dll")]
public static extern Int32 SetForegroundWindow(int hWnd);   


SetForegroundWindow(Handle.ToInt32());

Обновление

Дэвид полностью прав, для полноты я включаю в себя пункт с маркой +1 для Дэвида!

  • Процесс является передним процесс.
  • Процесс был начат переднего плана.
  • Процесс получил последний вход событие.
  • Не существует процесса переднего плана.
  • Процесс переднего плана отлажено.
  • Передний план не заблокирован (см. LockSetForegroundWindow).
  • Тайм-аут блокировки переднего плана истек (см. SPI_GETFOREGROUNDLOCKTIMEOUT в SystemParametersInfo).
  • Нет меню.

Ответ 4

Используйте методы Form.Activate() или Form.Focus().

Ответ 5

это работает:

if (WindowState == FormWindowState.Minimized)
    WindowState = FormWindowState.Normal;
else
{
    TopMost = true;
    Focus();
    BringToFront();
    TopMost = false;
}

Ответ 6

Прежде чем наткнуться на этот пост, я придумал это решение - переключить свойство TopMost:

this.TopMost = true;
this.TopMost = false;

У меня есть этот код в моем конструкторе форм, например:

public MyForm()
{
    //...

    // Brint-to-front hack
    this.TopMost = true;
    this.TopMost = false;

    //...
}

Ответ 7

Я использую SwitchToThisWindow, чтобы вывести приложение на передний план, как в этом примере:

static class Program
{
    [DllImport("User32.dll", SetLastError = true)]
    static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab);



    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        bool createdNew;
        int iP;
        Process currentProcess = Process.GetCurrentProcess();
        Mutex m = new Mutex(true, "XYZ", out createdNew);
        if (!createdNew)
        {
            // app is already running...
            Process[] proc = Process.GetProcessesByName("XYZ");

            // switch to other process
            for (iP = 0; iP < proc.Length; iP++)
            {
                if (proc[iP].Id != currentProcess.Id)
                    SwitchToThisWindow(proc[0].MainWindowHandle, true);
            }

            return;
        }

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new form());
        GC.KeepAlive(m);

    }

Ответ 8

Мой совет: не делай этого! Приложения, требующие внимания, должны мерцать панель задач, а не прыгать перед тем, что делал пользователь, и начинать перехватывать ключи и mouseclicks. Это ОЧЕНЬ плохая форма.

Я собирался опубликовать это как комментарий, но это слишком важно для проблемы.