cómo establecer el foco y el lanzamiento de la aplicación ya se está ejecutando en el botón evento click en c # .net3.5?

StackOverflow https://stackoverflow.com/questions/2197620

  •  25-09-2019
  •  | 
  •  

Pregunta

He estado tratando de utilizar el código de exclusión mutua, pero soy incapaz de abrir mi exe después de clic de botón im éxito en no hacer las múltiples entradas de la aplicación en la barra de tareas en el clic de botón, pero mi aplicación se inicia sólo cuando cierro mi forma .. quiero lanzar mi solicitud de clic de botón y si la aplicación ya está en marcha entonces necesito para centrarse en la aplicación en ejecución anterior .. ¿Cómo podría capaz de resolver mi necesidad de poner en marcha, así como focusin y la reapertura de que la aplicación de nuevo .. im enviando u my código que im utilizando en el evento de clic de botón y PLZ modificar mis errores ...

codificación en Program.cs

static void Main()  
{

    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    Application.Run(new Form1());
    System.Diagnostics.Process.Start("filename.exe");
}

:

codificación realiza en Form1.cs

private void button1_Click(object sender, EventArgs e)
{
    try
    {
       bool createdNew;
       Mutex m = new Mutex(true, "e-Recording", out createdNew);
       System.Diagnostics.ProcessStartInfo f = new System.Diagnostics.ProcessStartInfo("C:\\windows\\system32\\rundll32.exe", "C:\\windows\\system32\\shimgvw.dll,ImageView_Fullscreen " + "filename.exe".TrimEnd(null));

        if (createdNew) Launch();

        else
        {
             MessageBox.Show("e-Recording is already running!", "Multiple Instances");
         }
     }
     catch (Exception ex)
     {
          System.Diagnostics.Debug.WriteLine(ex.ToString());
     }
}
¿Fue útil?

Solución

Este es ser capaz de encontrar y cambiar a un proceso ya en ejecución que coincide con lo que está intentando iniciar.

[DllImport( "user32.dll" )]
public static extern bool ShowWindowAsync( HandleRef hWnd, int nCmdShow );
public const int SW_RESTORE = 9;

public void SwitchToCurrent() {
  IntPtr hWnd = IntPtr.Zero;
  Process process = Process.GetCurrentProcess();
  Process[] processes = Process.GetProcessesByName( process.ProcessName );
  foreach ( Process _process in processes ) {
    // Get the first instance that is not this instance, has the
    // same process name and was started from the same file name
    // and location. Also check that the process has a valid
    // window handle in this session to filter out other user's
    // processes.
    if ( _process.Id != process.Id &&
      _process.MainModule.FileName == process.MainModule.FileName &&
      _process.MainWindowHandle != IntPtr.Zero ) {
      hWnd = _process.MainWindowHandle;

      ShowWindowAsync( NativeMethods.HRef( hWnd ), SW_RESTORE );
      break;
    }
  }
 }

Otros consejos

Me ha escrito una respuesta de una vuelta, mientras que a una pregunta sobre Delphi. Me explicó que no tenía un fondo en Delphi pero se describe en un nivel alto de lo que hice en C # para construir un componente que utiliza comunicación entre procesos (IPC) con .NET interacción remota, no sólo para activar una instancia en ejecución, sino también hacia adelante los parámetros de línea de comando desde el segundo ejemplo en la primera instancia. He vinculado a una simple bonita para el uso de componentes que envuelve toda esta funcionalidad arriba. Puede ser útil para usted.

La suya es mi respuesta desde el otra pregunta:

  

La mejor manera de hacer esto es en realidad en   el código de la puesta en marcha de su exe. En   Es decir, permiten el Explorador de puesta en marcha de una   segunda copia de la exe que luego   procede a detectar que ya está   correr y tienen que enviar un mensaje a   la instancia en ejecución.

     

En lo personal, no tengo prácticamente ninguna   experiencia con Delphi, pero la manera en que yo   hizo esto en una aplicación .NET era   utilizando un mutex y un interproceso   canal de comunicación.

     

La idea general era que la primera   instancia de la aplicación haría   iniciar y empezar a escuchar sobre un PC   canal. También crearía un llamado   exclusión mutua entre procesos. Cuando el segundo   lanzó ejemplo, sería incapaz   para crear el mutex del mismo nombre   lo que significa que una instancia anterior   estaba corriendo y escuchando para las llamadas en   el canal IPC. La segunda instancia   luego se envían los argumentos de línea de comandos   a la primera instancia sobre IPC y el   primera instancia se pronunció al respecto.   El segundo ejemplo a continuación, sale sin   mostrar ninguna interfaz de usuario.

     

He subido el código para este   componente (C #) y el enlace es a continuación.   No creemos que tiene cualquier externa   dependencias y no sé lo que el   mecanismo de comunicación equivalente en   Delphi sería - pero espero que esto   le da algunas ideas.

     

InstanceManager componente (C #)

Tenga en cuenta que el uso de los mutex con nombre no se recomienda por razones de seguridad. Cualquier proceso (incluso uno que se ejecutan bajo la cuenta de invitado) puede crear un mutex con el mismo nombre antes de iniciar su proceso. La solución de estos problemas de seguridad es por lo general más difícil que simplemente no usando mutex llamado en absoluto.

Para resolver el problema, sólo tiene que manejador de proceso de almacenamiento o ID de proceso y luego busque una ventana con ese ID de proceso. Esto es similar a las obras administrador de tareas camino.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top