Ответ 1
Используйте Control.BringToFront
:
myForm.BringToFront();
Как перенести окно приложения на передний план? Например, мое приложение нуждается в внимании.
Это для моей личной программы. Мне нужна эта функциональность.
Это то, что я получил. Но он НЕ работает 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.
Я отлично работаю, но не всегда.
Используйте Control.BringToFront
:
myForm.BringToFront();
Вот фрагмент кода, который работал у меня
this.WindowState = FormWindowState.Minimized;
this.Show();
this.WindowState = FormWindowState.Normal;
Он всегда выводит нужное окно перед всеми остальными.
Пока я согласен со всеми, это нехорошее поведение, вот код:
[DllImport("User32.dll")]
public static extern Int32 SetForegroundWindow(int hWnd);
SetForegroundWindow(Handle.ToInt32());
Обновление
Дэвид полностью прав, для полноты я включаю в себя пункт с маркой +1 для Дэвида!
Используйте методы Form.Activate()
или Form.Focus()
.
это работает:
if (WindowState == FormWindowState.Minimized)
WindowState = FormWindowState.Normal;
else
{
TopMost = true;
Focus();
BringToFront();
TopMost = false;
}
Прежде чем наткнуться на этот пост, я придумал это решение - переключить свойство TopMost:
this.TopMost = true;
this.TopMost = false;
У меня есть этот код в моем конструкторе форм, например:
public MyForm()
{
//...
// Brint-to-front hack
this.TopMost = true;
this.TopMost = false;
//...
}
Я использую 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);
}
Мой совет: не делай этого! Приложения, требующие внимания, должны мерцать панель задач, а не прыгать перед тем, что делал пользователь, и начинать перехватывать ключи и mouseclicks. Это ОЧЕНЬ плохая форма.
Я собирался опубликовать это как комментарий, но это слишком важно для проблемы.