none
Lanzar proceso de forma oculta al usuario RRS feed

Todas las respuestas

  • Hola Jesus, has pensado en usar una variable del Tipo WebBrowser

     

    WebBrowser browser=new WebBrowser ();

            {

                browser.Navigated += new WebBrowserNavigatedEventHandler(browser_Navigated);

            }

     

            void browser_Navigated(object sender, WebBrowserNavigatedEventArgs e)

            {

    //            Aqui podrias buscar la cookie

            }


    Javier Torrecilla
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi Blog: Jtorrecilla
    Enlace a Faq de Winforms en Ingles Muy bueno
    • Marcado como respuesta Jesús Bosch martes, 4 de enero de 2011 6:32
    • Desmarcado como respuesta Jesús Bosch martes, 4 de enero de 2011 7:45
    lunes, 3 de enero de 2011 16:13
    Moderador
  • Hola Javier,

    Nunca he usado esa clase. Lo que quiero es generar yo la Cookie desde la aplicación, para que cuando el usuario haga determinadas acciones con ella, en ciertos momentos, se puedan abrir unas URL en el navegador por defecto del usuario.

    Esa clase lo permite?


    Jesús Bosch Aiguadé
    http://geeks.ms/blogs/jbosch
    lunes, 3 de enero de 2011 17:21
  • Hola Jesus,

     

    Podrías exponerme un poco mas en detalle lo que necesitas haceR?

     

     


    Javier Torrecilla
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi Blog: Jtorrecilla
    Enlace a Faq de Winforms en Ingles Muy bueno
    lunes, 3 de enero de 2011 18:27
    Moderador
  • Hola lo que necesitas es crear una cookie desde una aplicacion de escritorio o desde un webform si lo estas haciendo desde un winform podrias usar un truquillo que es usar el control webBrowser  con ella podrias llamar a la url para  crear  la cookie y al momento de hacer el llamado  del formulario que contiene el webBrowser , y  podrias  ocultar el formulario  asi el proceso correria por detras  y tu cookie se crearia  sin que el usuario se diera cuenta .

    Espero ser lo bastante explicitos cualquier duda  me avisas.

    Saludos...

    • Marcado como respuesta Jesús Bosch martes, 4 de enero de 2011 6:32
    • Desmarcado como respuesta Jesús Bosch martes, 4 de enero de 2011 7:45
    lunes, 3 de enero de 2011 18:48
  • Buenas! Jesús tio... te va a terminar doliendo la cabeza, te lo digo ya! ;-)

    Bueno... El problema principal de lo que planteas es que cada navegador tiene sus cookies ;-)

    Desde winforms puedes crear cookies WinIntet usando InternetSetCookieEx (http://msdn.microsoft.com/en-us/library/aa385108(VS.85).aspx) y recoger cookies WinInet usando InternetGetCookieEx (http://msdn.microsoft.com/en-us/library/aa384714(VS.85).aspx). El control WebBrowser está basado en IE, así que usa las cookies WinIntet (de Chrome y Firefox... olvídate).

    Te cuento lo que hice yo en un proyecto que creo, necesitaba algo parecido a lo tuyo:

    1. Usar WebRequest para hacer una llamada HTTP. No quería usar un WebBrowser ni nada parecido, porque no quiero mostrar el resultado. En mi caso el resultado devuelto era una cookie que debía poner disponible para el navegador del usuario.
    2. Una vez obtenida la respuesta user WebResponse, para ver el header Set-Cookie y establecer dicho Set-Cookie en WinInet usando InternetSetCookieEx.

    Echa un vistazo a http://blogs.msdn.com/b/ieinternals/archive/2009/08/20/wininet-ie-cookie-internals-faq.aspx?PageIndex=3 (especialmente Q10 y Q11)... y suerte! ;-)

    No se si es la respuesta que esperas...


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis
    martes, 4 de enero de 2011 8:12
  • Ah!
    Sobre el tema de usar Process.Start para lanzar el navegador y que ese navegue hacia la URL, aún suponiendo que pudieses ocultar la ventana creada por el proceso, debes tener presente que si la cookie que te genera es de sesión o http-only no te va a quedar disponible, ya que esas se guardan a nivel de proceso.

    De todos modos, antes de la parrafada que te he dicho antes, pruébalo... a ver si usando CreateNoWindow funciona (http://msdn.microsoft.com/es-es/library/system.diagnostics.processstartinfo.createnowindow(v=vs.80).aspx).

    Saludos!

     


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis
    martes, 4 de enero de 2011 8:19
  • Buenas,

    Lo malo es que necesito que la cookie sea para el navegador por defecto :(

    InternetSetCookie lo he probado, pero sólo funciona con Internet Explorer.

    El Process.Start me funciona con Iexplorer y firefox (la aproximación sería crear la cookie abriendo una web que lo haga). El ____ chrome funciona, pero se hace visible al usuario. Por ahora el código que tengo es este:

    private void button1_Click(object sender, EventArgs e)
            {
                Process p = new Process();

                p.StartInfo.FileName = GetDefaultBrowserPath();
                p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                p.StartInfo.Arguments = "http://www.yahoo.com";

                p.Start();
            }

            private static string GetDefaultBrowserPath()
            {
                string key = @"http\shell\open\command";
                Microsoft.Win32.RegistryKey registryKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(key, false);
                
                // get default browser path
                return StringToPath(((string)registryKey.GetValue(nullnull)));
            }

            private static string StringToPath(string str)
            {
                char chPathEnd = ' ';
                int diff = 0;
                if (str[0] == '"')
                {
                    chPathEnd = '"';
                    diff = 1;
                }
                for (int i = 1; i < str.Length; i++)
                    if (str[i] == chPathEnd)
                        return str.Substring(diff, i - diff);
                return str;
            } 

    Si consigo que funcione ya subiré el código.

     

    Un saludo


    Jesús Bosch Aiguadé
    http://geeks.ms/blogs/jbosch
    martes, 4 de enero de 2011 9:21
  • Hola Jesús,

     

    Sin probarlo, se me ocurre, que añadiendo un poco a lo que dice Eduard de utilizar un WebRequest para hacer la petición,

    Podrías acceder directamente al directorio de Cookies del Equipo y Buscar la cookie que has creado (Quizas sea irme por los cerros de ubeda...)

     


    Javier Torrecilla
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi Blog: Jtorrecilla
    Enlace a Faq de Winforms en Ingles Muy bueno
    martes, 4 de enero de 2011 9:34
    Moderador
  • Buenas,

    Todas las opciones que veo son una guarrada. Os presento la madre de todas las guarradas (aunque hay que decir que funciona). Esto hace lo siguiente: Lanza el proceso, lo oculta mediante la API de windows al cabo de unos segundos (esto es necesario sólo para chrome). Guarrada monumental vamos, no recomendado a nadie. Au así dejo el código por aquí: 

        [DllImport("user32.dll")]
        static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
     
        Process ApplicationProcess;
        
        private void button3_Click(object sender, EventArgs e)
        {
          ApplicationProcess = new Process();
          ApplicationProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
          ApplicationProcess.StartInfo.FileName = GetDefaultBrowserPath();
          ApplicationProcess.StartInfo.Arguments = "http://www.eneagames.net";
          ApplicationProcess.Start();
    
          System.Threading.Thread.Sleep(1000);
    
          Process[] processes = Process.GetProcesses();
    
          foreach (var process in processes)
          {
            if (process.ProcessName.ToLower().Contains("chrome"))
            {
              IntPtr handle = process.MainWindowHandle;
              
              ShowWindow(handle, 0);
            }
          }
    
          System.Threading.Thread.Sleep(20000);
    
          processes = Process.GetProcesses();
    
          foreach (var process in processes)
          {
            if (process.ProcessName.ToLower().Contains("chrome"))
            {
              process.Kill();
            }
          }
        }  
    
        /// <summary>
        /// Reads path of default browser from registry
        /// </summary>
        /// <returns></returns>
        private static string GetDefaultBrowserPath()
        {
          string key = @"http\shell\open\command";
          Microsoft.Win32.RegistryKey registryKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(key, false);
    
          // get default browser path
          return StringToPath(((string)registryKey.GetValue(null, null)));
        }
    
        private static string StringToPath(string str)
        {
          char chPathEnd = ' ';
          int diff = 0;
          if (str[0] == '"')
          {
            chPathEnd = '"';
            diff = 1;
          }
          for (int i = 1; i < str.Length; i++)
            if (str[i] == chPathEnd)
              return str.Substring(diff, i - diff);
          return str;
        }
    

    Jesús Bosch Aiguadé
    http://geeks.ms/blogs/jbosch
    martes, 4 de enero de 2011 11:30
  • umh, se me plantea que eso te va a dar problemas :S

    Imaginate que tienes un usuario cuyo explorer por defecto sea o  no Chrome , también tiene Chrome instalado.

    Si mientras está usando tu APP, está usando también Chrome para otros menesteres, le va a cerrar todos los procesos que tengas abiertos.


    Javier Torrecilla
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi Blog: Jtorrecilla
    Enlace a Faq de Winforms en Ingles Muy bueno
    martes, 4 de enero de 2011 11:35
    Moderador
  • Bueno... las guarradas a veces están bien (especialmente si está Gianna Michaels de por medio... ññññaaaam!).

    De hecho te iba a proponer esto mismo que has implementado pero me he dicho: no, no tengo narices de proponer eso mismo como solución... :p

    Se nota algún parpadeo cuando usas Chrome?

    Y por cierto... probaste con CreateNoWindoe a true en el processinfo al usar process.Start() en lugar del ProcessWindowStyle.Hidden?

    Un saludo! ;-)


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis
    martes, 4 de enero de 2011 11:36
  • Pues... tienes razón!

    Jesús, sería mejor que dejaras que la propia classe Process te diera el HWND principal. Es decir, usa sólo el MainWindowHandle de la clase process que creas (ApplicationProcess) en lugar de iterar por todos los procesos de la máquina!

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis
    martes, 4 de enero de 2011 11:40
  • Pues... tienes razón!

    Jesús, sería mejor que dejaras que la propia classe Process te diera el HWND principal. Es decir, usa sólo el MainWindowHandle de la clase process que creas (ApplicationProcess) en lugar de iterar por todos los procesos de la máquina!

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis


    Hola Eduard,

    Eso mismo pensaba yo, y sería válido si abro el notepad. Pero por algún misterioso motivo, si hago un process.start de una página web, el MainWindowModuleHandle del proceso al cual he llamado el Start() me sale vacío! Raro verdad?

    PD: CreateNoWindow es igualmente ignorado por chrome :(


    Jesús Bosch Aiguadé
    http://geeks.ms/blogs/jbosch
    martes, 4 de enero de 2011 13:11