c# - tutorial - windows forms descargar
¿Cómo puedo llevar la ventana de mi aplicación al frente? (7)
Antes de tropezar con esta publicación, se me ocurrió esta solución: para alternar la propiedad TopMost:
this.TopMost = true;
this.TopMost = false;
Tengo este código en el constructor de mi formulario, por ejemplo:
public MyForm()
{
//...
// Brint-to-front hack
this.TopMost = true;
this.TopMost = false;
//...
}
Esta pregunta ya tiene una respuesta aquí:
¿Cómo llevar la ventana de mi aplicación al frente? Por ejemplo, cuando mi aplicación necesita atención.
Esto es para mi programa personal. Necesito esa funcionalidad.
Esto es lo que conseguí. Pero NO funciona 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;
}
}
Y los llamo del trabajador de fondo.
BringToFrontToEnterCaptha();
while (!ready)
{
Thread.Sleep(100);
}
BringToBackAfterEnterCaptha();
Thread.Sleep(300);
Y luego de presionar el botón "Aceptar" bool listo se establece en verdadero.
Yo trabajo genial, pero no siempre.
Aquí hay una pieza de código que funcionó para mí
this.WindowState = FormWindowState.Minimized;
this.Show();
this.WindowState = FormWindowState.Normal;
Siempre trae la ventana deseada al frente de todas las demás.
Aunque estoy de acuerdo con todos, este es un comportamiento nada agradable, aquí está el código:
[DllImport("User32.dll")]
public static extern Int32 SetForegroundWindow(int hWnd);
SetForegroundWindow(Handle.ToInt32());
Actualizar
David tiene toda la razón, para completar, incluyo el punto más aquí +1 para David.
- El proceso es el proceso en primer plano.
- El proceso fue iniciado por el proceso en primer plano.
- El proceso recibió el último evento de entrada.
- No hay un proceso en primer plano.
- El proceso en primer plano se está depurando.
- El primer plano no está bloqueado (ver LockSetForegroundWindow).
- El tiempo de espera de bloqueo de primer plano ha caducado (consulte SPI_GETFOREGROUNDLOCKTIMEOUT en SystemParametersInfo).
- No hay menús activos.
Use Control.BringToFront
:
myForm.BringToFront();
Use los Form.Activate()
o Form.Focus()
.
Yo uso SwitchToThisWindow para llevar la aplicación a primer plano como en este ejemplo:
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);
}
esto funciona:
if (WindowState == FormWindowState.Minimized)
WindowState = FormWindowState.Normal;
else
{
TopMost = true;
Focus();
BringToFront();
TopMost = false;
}