SoloCodigo

CLR: .Net / Mono / Boo / Otros CLR => C# => Mensaje iniciado por: cob1979 en Miércoles 26 de Mayo de 2010, 23:52

Título: APIS con C#
Publicado por: cob1979 en Miércoles 26 de Mayo de 2010, 23:52
Amigos, hace días me estoy rompiendo la cabeza, pues he querido hacer un servicio que interactue con la bandeja del sistema (o Area de notificaciones). EL mismo trabajará con las API de windows para lograr lo antes mencionado.

Hice una clase como dicen los libros con métodos estáticos.

internal static class NativeMethods
        {
            // Lot of API's definitions
 
            [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
            internal static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

           ........................................
       }
Este es el primer método, por supuesto hay más pero ya aquí no trabaja, pues debe devolverme el manipulador de la ventana

Después invoco los métodos::

 IntPtr hwndParent = NativeMethods.FindWindow("Shell_TrayWnd", null);

y cuando depuro, me dice que hwndParent = 0;
Lo cual no debe ser así...

Este mismo código lo comprobé con un proyecto formulario de Windows y hasta un proyecto simple, y todo me trabaja de maravillas, pero no sé por qué con un servicio no. Quizás los servicios necesiten otro código adicional, o no se pueda trabajar con la bandeja del sistema.

Por favor si tienen alguna sugerencia se los agradeceré.  :argh:  :argh:
Título: Re: APIS con C#
Publicado por: Jeysscarr en Jueves 27 de Mayo de 2010, 00:03
:blink: !!!!!!!!! No te queda mas sencillo si en vez de apis usas la clase NotifyIcon?????????????????????????
Título: Re: APIS con C#
Publicado por: cob1979 en Jueves 27 de Mayo de 2010, 00:10
Cita de: "Jeysscarr"
:blink: !!!!!!!!! No te queda mas sencillo si en vez de apis usas la clase NotifyIcon?????????????????????????

Para serte sincero miré la clase NotifyIcon por arriba y me pareció que lo más que me permitía era agregar un ícono de la aplicación a la bandeja, y ya te digo no la profundicé mucho.

Pero lo que quisiera es que el servicio manipulara todos los íconos alojados en dicha bandeja del sistema (de todos los programas). Muchas gracias y veré si la clase NotifyIcon me brinda hasta donde quiero llegar.
Título: Re: APIS con C#
Publicado por: Jeysscarr en Jueves 27 de Mayo de 2010, 00:11
por otro lado si es estrictamente necesario usar el API trata con algo como esto:
Un ejemplo para obtener la ventana del block de notas

Código: C#
  1. using System.Diagnostics;
  2. Process[] processes = Process.GetProcessesByName("notepad");
  3.  
  4. foreach (Process p in processes)
  5. {
  6.     IntPtr pFoundWindow = p.MainWindowHandle;
  7. }
  8.  

para cerrarla...:p.CloseMainWindow();
Título: Re: APIS con C#
Publicado por: cob1979 en Jueves 27 de Mayo de 2010, 00:31
Cita de: "Jeysscarr"
por otro lado si es estrictamente necesario usar el API trata con algo como esto:
Un ejemplo para obtener la ventana del block de notas

Código: C#
  1. using System.Diagnostics;
  2. Process[] processes = Process.GetProcessesByName("notepad");
  3.  
  4. foreach (Process p in processes)
  5. {
  6.     IntPtr pFoundWindow = p.MainWindowHandle;
  7. }
  8.  

para cerrarla...:p.CloseMainWindow();


Ok, gracias  :)  :)  y veré que hago. Si me dan otras sugerencias les agradecería....
Título: Re: APIS con C#
Publicado por: Jeysscarr en Jueves 27 de Mayo de 2010, 00:50
Hola, me intrigó tu duda, asi que estuve buscando en algunos articulos y lleve a cabo una prueba---

lo unico que hice fue con la funcion que escribi hace un rato determinar el nombre de la ventana WindowName y pasarselo a la funcion que tu ya usas, FindWindow pero asi:

IntPtr hWnd = FindWindow(null, windowName);

de ahi me dio resultado y me queda lista para trabajar con SendMessage
Título: Re: APIS con C#
Publicado por: cob1979 en Jueves 27 de Mayo de 2010, 23:29
Cita de: "Jeysscarr"
lo unico que hice fue con la funcion que escribi hace un rato determinar el nombre de la ventana WindowName y pasarselo a la funcion que tu ya usas, FindWindow pero asi:

IntPtr hWnd = FindWindow(null, windowName);

de ahi me dio resultado y me queda lista para trabajar con SendMessage

Sí a mí me trabaja bien desde otra aplicación que no sea un servicio de windows. Me trabaja de maravilla como expuse cuando abrí el tema. Pero la cosa es cuando trato de hacerlo desde un servicio windows. No devuelve el hWnd. Cuando depuro me da cero.
Debe ser que los servicios necesitan algo más, estuve leyendo en la ayuda de Visual Studio, algo como que los servicios trabaja con un escritorio y estación de trabajo diferentes a la del usuario. Pero no estoy muy seguro si ahí está la cosa ahora sigo  profundizando en el tema. Gracias de todas formas. Si quieres pudes echar una ojeada a la ayuda windows en el tema: Introducción a las aplicaciones de servicios de Windows
Título: Re: APIS con C#
Publicado por: cob1979 en Sábado 29 de Mayo de 2010, 16:56
Cita de: "cob1979"
estuve leyendo en la ayuda de Visual Studio, algo como que los servicios trabaja con un escritorio y estación de trabajo diferentes a la del usuario.

Estaba aquí el asunto amigo... Y la solución era tan fácil como ir a la herramienta "Administración de Equipo", en Servicio, buscar las propiedades del servicio (clic derecho sobre el servicio ->propiedades), en la pestaña Iniciar seccion, Selecionar "Cuenta del sistema local" y "Permitir a los servicios interactuar con el escritorio" y ya está.

Que facil ahora... :beer:  :beer:
Título: Re: APIS con C#
Publicado por: Jeysscarr en Sábado 29 de Mayo de 2010, 16:58
si??.. guardado tu experiencia en mis notas utiles  :good:
Título: Re: APIS con C#
Publicado por: cob1979 en Sábado 29 de Mayo de 2010, 16:59
Cita de: "cob1979"
estuve leyendo en la ayuda de Visual Studio, algo como que los servicios trabaja con un escritorio y estación de trabajo diferentes a la del usuario.

Estaba aquí el asunto amigo... Y la solución era tan fácil como ir a la herramienta "Administración de Equipo", en Servicio, buscar las propiedades del servicio (clic derecho sobre el servicio ->propiedades), en la pestaña Iniciar seccion, Selecionar "Cuenta del sistema local" y "Permitir a los servicios interactuar con el escritorio" y ya está.

Que facil ahora... :beer:  :beer: