Comment amener ma fenêtre d'application au premier plan? Par exemple, quand mon application a besoin d'attention.
Ceci est pour mon programme personnel. J'ai besoin de cette fonctionnalité.
C'est ce que j'ai eu. Mais c'est PAS travailler 100% fois.
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;
}
}
Et je les appelle d'ouvrier d'arrière-plan.
BringToFrontToEnterCaptha();
while (!ready)
{
Thread.Sleep(100);
}
BringToBackAfterEnterCaptha();
Thread.Sleep(300);
Et après avoir appuyé sur le bouton "Accepter", Bool Ready est défini sur true.
Je travaille bien mais pas toujours.
Utilisation Control.BringToFront
:
myForm.BringToFront();
Voici un morceau de code qui a fonctionné pour moi
this.WindowState = FormWindowState.Minimized;
this.Show();
this.WindowState = FormWindowState.Normal;
Il apporte toujours la fenêtre souhaitée à l'avant de tous les autres.
Utilisez les méthodes Form.Activate()
ou Form.Focus()
.
Bien que je sois d’accord avec tout le monde, ce n’est pas un comportement gentil, voici le code:
[DllImport("User32.dll")]
public static extern Int32 SetForegroundWindow(int hWnd);
SetForegroundWindow(Handle.ToInt32());
Mise à jour
David a tout à fait raison. Par souci d'exhaustivité, j'inclus ici le point de la balle +1 pour David!
cela marche:
if (WindowState == FormWindowState.Minimized)
WindowState = FormWindowState.Normal;
else
{
TopMost = true;
Focus();
BringToFront();
TopMost = false;
}
Avant de trébucher sur ce post, j'ai proposé cette solution - pour basculer la propriété TopMost:
this.TopMost = true;
this.TopMost = false;
J'ai ce code dans le constructeur de mon formulaire, par exemple:
public MyForm()
{
//...
// Brint-to-front hack
this.TopMost = true;
this.TopMost = false;
//...
}
J'utilise SwitchToThisWindow pour amener l'application au premier plan comme dans cet exemple:
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);
}