• Domingo 22 de Diciembre de 2024, 13:59

Autor Tema:  APIS con C#  (Leído 4483 veces)

cob1979

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
APIS con C#
« en: Miércoles 26 de Mayo de 2010, 23:52 »
0
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:

Jeysscarr

  • Miembro MUY activo
  • ***
  • Mensajes: 134
  • Nacionalidad: co
    • Ver Perfil
Re: APIS con C#
« Respuesta #1 en: Jueves 27 de Mayo de 2010, 00:03 »
0
:blink: !!!!!!!!! No te queda mas sencillo si en vez de apis usas la clase NotifyIcon?????????????????????????
Nuestro poder está creciendo mas rápido que nuestra sabiduria

cob1979

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Re: APIS con C#
« Respuesta #2 en: Jueves 27 de Mayo de 2010, 00:10 »
0
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.

Jeysscarr

  • Miembro MUY activo
  • ***
  • Mensajes: 134
  • Nacionalidad: co
    • Ver Perfil
Re: APIS con C#
« Respuesta #3 en: Jueves 27 de Mayo de 2010, 00:11 »
0
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();
Nuestro poder está creciendo mas rápido que nuestra sabiduria

cob1979

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Re: APIS con C#
« Respuesta #4 en: Jueves 27 de Mayo de 2010, 00:31 »
0
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....

Jeysscarr

  • Miembro MUY activo
  • ***
  • Mensajes: 134
  • Nacionalidad: co
    • Ver Perfil
Re: APIS con C#
« Respuesta #5 en: Jueves 27 de Mayo de 2010, 00:50 »
0
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
Nuestro poder está creciendo mas rápido que nuestra sabiduria

cob1979

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Re: APIS con C#
« Respuesta #6 en: Jueves 27 de Mayo de 2010, 23:29 »
0
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

cob1979

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Re: APIS con C#
« Respuesta #7 en: Sábado 29 de Mayo de 2010, 16:56 »
0
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:
« última modificación: Sábado 29 de Mayo de 2010, 17:00 por cob1979 »

Jeysscarr

  • Miembro MUY activo
  • ***
  • Mensajes: 134
  • Nacionalidad: co
    • Ver Perfil
Re: APIS con C#
« Respuesta #8 en: Sábado 29 de Mayo de 2010, 16:58 »
0
si??.. guardado tu experiencia en mis notas utiles  :good:
Nuestro poder está creciendo mas rápido que nuestra sabiduria

cob1979

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Re: APIS con C#
« Respuesta #9 en: Sábado 29 de Mayo de 2010, 16:59 »
0
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: