Entonces, busqué en google y SO antes de hacer esta pregunta. Básicamente tengo una DLL que tiene un formulario compilado en ella. El formulario se usará para mostrar información en la pantalla. Eventualmente será asincrónico y expondrá mucha personalización en el dll. Por ahora solo quiero que se muestre correctamente. El problema que estoy teniendo es que uso el archivo dll al cargarlo en una sesión de Powershell. Así que cuando trato de mostrar el formulario y lograr que llegue a la cima y tener el foco, no tiene ningún problema con mostrarlo en todas las demás aplicaciones, pero no puedo hacerlo verlo en la ventana de Powershell. . Aquí está el código que estoy usando para tratar de que se muestre. Estoy seguro de que la mayoría de ellos no serán necesarios una vez que lo encuentre, esto solo representa todas las cosas que encontré a través de google.C# Force Form Focus
CLass Blah
{
[DllImport("user32.dll", EntryPoint = "SystemParametersInfo")]
public static extern bool SystemParametersInfo(uint uiAction, uint uiParam, uint pvParam, uint fWinIni);
[DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("User32.dll", EntryPoint = "ShowWindowAsync")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
private const int WS_SHOWNORMAL = 1;
public void ShowMessage(string msg)
{
MessageForm msgFrm = new MessageForm();
msgFrm.lblMessage.Text = "FOO";
msgFrm.ShowDialog();
msgFrm.BringToFront();
msgFrm.TopMost = true;
msgFrm.Activate();
SystemParametersInfo((uint)0x2001, 0, 0, 0x0002 | 0x0001);
ShowWindowAsync(msgFrm.Handle, WS_SHOWNORMAL);
SetForegroundWindow(msgFrm.Handle);
SystemParametersInfo((uint)0x2001, 200000, 200000, 0x0002 | 0x0001);
}
}
como digo Estoy seguro de que la mayoría de lo que se necesita o no o incluso plano erróneas, sólo quería mostrar las cosas que había intentado. Además, como mencioné, planeo que esto se muestre de forma asíncrona en algún momento que sospecho que terminará requiriendo un hilo separado. ¿Se dividiría el formulario en su propio hilo para facilitar el enfoque en la sesión de Powershell?
@Joel, gracias por la información. Esto es lo que he intentado en base a su sugerencia:
msgFrm.ShowDialog();
msgFrm.BringToFront();
msgFrm.Focus();
Application.DoEvents();
La forma aún aparece bajo la sesión de PowerShell. Procederé a resolver el enhebrado. He generado hilos antes, pero nunca donde el hilo padre necesitaba hablar con el hilo hijo, así que ya veremos cómo funciona.
Thnks para todas las ideas hasta ahora gente.
Bien, el enhebrado resolvió el problema. @Quarrelsome, probé ambos. Ninguno (ni ambos juntos) funcionó. Tengo curiosidad sobre lo que es malo sobre el uso de enhebrar? No estoy utilizando Application.Run y aún no he tenido un problema. Estoy usando una clase de mediador a la que tienen acceso el subproceso padre y el subproceso secundario. En ese objeto, estoy usando ReaderWriterLock para bloquear una propiedad que representa el mensaje que quiero que se muestre en el formulario que crea el subproceso secundario. El padre bloquea la propiedad y luego escribe lo que se debe mostrar. El subproceso secundario bloquea la propiedad y lee a qué debería cambiar la etiqueta en el formulario. El niño tiene que hacer esto en un intervalo de sondeo (lo prefiero a 500ms) de lo que no estoy muy contento, pero no pude encontrar un modo impulsado por eventos para que el hilo hijo supiera que la libertad había cambiado, así que ' Estoy atascado con las encuestas.
¿Puedes llamar Focus() en uno de los controles en el formulario? –
Gracias por las respuestas. @Chad, simplemente tratando de enfocar() un control en el formulario terminó con los mismos resultados que ya estaba obteniendo. @Dean, creo que para utilizar su método tendré que dividir el formulario en su propio hilo. Planeé hacerlo de todos modos en algún momento, así que supongo que comenzaré con eso ahora. – EBGreen