Ocultar icono del area de notificacion

Iniciado por llAudioslavell, 22 Septiembre 2016, 16:31 PM

0 Miembros y 1 Visitante están viendo este tema.

llAudioslavell

Hola a todos !! quisiera estar seguro de algo estimados, de que manera puedo ocultar por completo un icono del area de notificacion?? Haciendo hooking, inyectando dll y todo esos metodos, llegare a ocultar el icono que yo quiero ???? Necesito hacer esto utilizando cualquier metodo posible. He probado ya varios programas y ninguno me funciona.

Agradeceria bastante que me ayuden con esto ya que estoy en unos aprietos.
Muchas gracias de ante mano.

llAudioslavell

#1
He conseguido ocultar TODOS los iconos del area de notificacion con regedit pero lo que quiero es ocultar un icono en especifico   :-\ y eso no tengo ni la menor idea de como hacerlo.
Iluminenme porfavor !!!!!!!  :(  :(  :(

PSDT: El icono es un programa que yo lo ejecuto al iniciar windows que nose como pero tengo que ocultarlo si o si, claro que tiene que seguir ejecutandose el programa.

okik

#2
¿es un icono con tetas o algo así o que? XD

Lo típico sería dar con el botón derecho al reloj de la barra de tareas. Y haces clic en 'Personalizar iconos de notificación'  Busca el que no quieres que se vea y cambias a 'Ocultar icono y notificación'. Pero esto no lo quita realmente, solo lo oculta, per si le das para extender los iconos de notificación, se verá igualmente.

Desde consola o modificando algo del registro no se me ocurre como. Tan solo modificando el propio programa.

Para modificarlo puedes usar Resource Hacker.

Haz una copia del EXE del programa y después abres el EXE del programa con Resource Hacker. RH mostrará un árbol de carpetas y debería  haber una carpetita llamada Icon Group que contiene iconos. Los puedes eliminar o bien sustituirlo por iconos nulos sin imagen. Yo los eliminaría directamente, selecciona un icono o grupo de iconos, clic con el botón derecho y selecciona 'Delete Resource'. Deberías borrar el que se ve en el área de notificación.

Luego guardas y al hacerlo RH creará una copia automática del EXE original y el modificado. Si ejecutas el EXE (el modificado) ya no debería mostrar ningún icono de notificación.

No te preocupes si  el icono del  EXE cambia. Si el programa usa un icono para todo el área de notificación, el EXE, la ventana, etc. Al borrarlo Windows le pone uno general pero no mostrará ninguno en el área de notificación.


va olvídalo he probado lo de borrar el icono y no funciona. Debería pero no.

Quizás con otro tipo de modificación, accediendo al código binario.







Eleкtro

#3
Una solución programática podría ser identificar el botoncito que quieres eliminar (si, esos iconos del área de notificación son controles de tipo Button) y seguídamente llamar a la función Win32 ShowWindow, CloseWindow o DestroyWindow o tal vez DestroyIcon, usando la parametización adecuada para ocultar y/o cerrar la ventana.

El control que he marcado en la imagen de abajo, es un control de tipo Toolbar, y el nombre de clase de la ventana de ese control es ToolbarWindow32.


El árbol de nombres de clases empezando por la ventana padre (la barra de tareas) es la siguiente:

  • Shell_TrayWnd
  •    TrayNotifyWnd
  •        SysPager
  •            ToolbarWindow32

El problema, es que los botoncitos/iconos de adentro parecen inaccesibles hasta donde probé, no se pueden enumerar con la función Win32 EnumChildWindows ni tampoco se le puede hacer un Spy con las herramientas específicas para el análisis de un árbol de controles y jerarquías de ventanas, ni siquiera el framework de Microsoft UI Automation es capaz de identificar esos botoncitos/iconos dentro del área roja, la única forma que encontré para identificar esos botoncitos/iconos fue utilizando la herramienta Visual UI Automation de la SDK de Windows, pero esos controles ni siquiera exponen un handle de ventana ni ningún otro tipo de identificador que pudiera servirnos para automatizar la tarea.

Si examinamos los mensajes de controles disponibles para un control Win32 de tipo Toolbar, no parece haber nada que nos permita eliminar un botón específico:
...o al menos, en un principio a mi me parece que no, pero voy a hecharle un ojo detenidamente a ver si logro encontrar algún mensaje que nos sirva.

EDITO: En teoría le podemos enviar el mensaje TB_BUTTONCOUNT al control para obtener la cantidad de botones, y de esta manera luego podemos hacer un búcle para enviarle el mensaje TB_GETBUTTON con el índice de cada botón para obtener informacion de cada botón, y así identificar el botón que se quiere ocultar o eliminar.
El problema es que en mi Windows 10 no funciona, a pesar de haber utilizado las estructuras definidas por Microsoft: http://referencesource.microsoft.com/#UIAutomationClientsideProviders/MS/Internal/AutomationProxies/CommonXSendMessage.cs,d6764b5a08c7e1e8,references se me refresca el escritorio al enviar el mensaje TB_GETBUTTON incluso pasándole un valor nulo al parámetro lParam de dicho mensaje, no hay manera de que devuelva la información de un botón, jeje, seguiré investigando a ver...

Saludos!








okik

#4
Cita de: Eleкtro en 23 Septiembre 2016, 17:45 PM
Una solución programática podría ser identificar el botoncito que quieres eliminar (si, esos iconos del área de notificación son controles de tipo Button) y seguídamente llamar a la función Win32 ShowWindow, CloseWindow o DestroyWindow o tal vez DestroyIcon, usando la parametización adecuada para ocultar y/o cerrar la ventana.

El control que he marcado en la imagen de abajo, es un control de tipo Toolbar, y el nombre de clase de la ventana de ese control es ToolbarWindow32.


El árbol de nombres de clases empezando por la ventana padre (la barra de tareas) es la siguiente:

  • Shell_TrayWnd
  •    TrayNotifyWnd
  •        SysPager
  •            ToolbarWindow32

El problema, es que los botoncitos/iconos de adentro parecen inaccesibles hasta donde probé, no se pueden enumerar con la función Win32 EnumChildWindows ni tampoco se le puede hacer un Spy con las herramientas específicas para el análisis de un árbol de controles y jerarquías de ventanas, ni siquiera el framework de Microsoft UI Automation es capaz de identificar esos botoncitos/iconos dentro del área roja, la única forma que encontré para identificar esos botoncitos/iconos fue utilizando la herramienta Visual UI Automation de la SDK de Windows, pero esos controles ni siquiera exponen un handle de ventana ni ningún otro tipo de identificador que pudiera servirnos para automatizar la tarea.

Si examinamos los mensajes de controles disponibles para un control Win32 de tipo Toolbar, no parece haber nada que nos permita eliminar un botón específico:
...o al menos, en un principio a mi me parece que no, pero voy a hecharle un ojo detenidamente a ver si logro encontrar algún mensaje que nos sirva.

EDITO: En teoría le podemos enviar el mensaje TB_BUTTONCOUNT al control para obtener la cantidad de botones, y de esta manera luego podemos hacer un búcle para enviarle el mensaje TB_GETBUTTON con el índice de cada botón para obtener informacion de cada botón, y así identificar el botón que se quiere ocultar o eliminar.
El problema es que en mi Windows 10 no funciona, a pesar de haber utilizado las estructuras definidas por Microsoft: http://referencesource.microsoft.com/#UIAutomationClientsideProviders/MS/Internal/AutomationProxies/CommonXSendMessage.cs,d6764b5a08c7e1e8,references se me refresca el escritorio al enviar el mensaje TB_GETBUTTON incluso pasándole un valor nulo al parámetro lParam de dicho mensaje, no hay manera de que devuelva la información de un botón, jeje, seguiré investigando a ver...

Saludos!

Como dije modificando el código fuente del programa (que yo he llamado código binario en la anterior respuesta) con un simple editor Hexadecimal.  Solo hay que saber que tocar  :silbar:



Acabo de recordar que yo tenía algo de eso mediante programación. Había que usar el handle de la aplicación y enviar un mensaje. A ver si lo encuentro....

Eleкtro

#5
Cita de: okik en 24 Septiembre 2016, 13:33 PMComo dije modificando el código fuente del programa (que yo he llamado código binario en la anterior respuesta) con un simple editor Hexadecimal.  Solo hay que saber que tocar  :silbar:

Efectivamente, mediante un desamblador+depurador como IDA u OllyDbg se podría localizar la instrucción que invoka al icono de notificación y luego eliminarla/bypassearla (o si despues de localizarla se prefiere aplicar el parche a las direcciones implicadas mediante un editor hexadecimal, allá cada uno), eso sería una solución alternativa, sin embargo requiere conocimientos de ingenieria inversa que el usuario no parece tener... (y yo tampoco los tengo a un nivel avanzado)

Si estuviesemos hablando de una aplicación .NET entonces sería bastante sencillo, se podría acceder directamente al código fuente representado en código de lenguaje para modificarlo a nuestro gusto y listo, para ello se pueden usar decompiladores como .NET Reflector de Redgate.

Saludos!








okik

#6
ya lo encontré   :laugh:

Realmente es muy simple, busqué entre mis snippets modificaciones de ventana, en los cuales les envío un mensaje  a una ventana para cambiar los menús la barra añadir cosas, obtener informción, etc.

Y finalmente es de lo más simple. Simplemente ocultando la ventana con ShowWindow. Más bien eliminando el modo 'ventana'


Código (vbnet) [Seleccionar]
  <DllImport("user32.dll")> _
   Shared Function ShowWindow(ByVal hWnd As IntPtr, ByVal nCmdShow As Integer) As Boolean
   End Function



Obtienes el handle mendiante Process, con NET por ejemplo:

Código (vbnet) [Seleccionar]
    Dim NommbreAppa As String = "Notepad"
       Dim HwndProcess As IntPtr = IntPtr.Zero
       For Each Proceso In Process.GetProcesses()
           If Proceso.ProcessName = NommbreAppa.ToLower Then
               HwndProcess = Proceso.MainWindowHandle
           End If
       Next



y luego le cambias el estado a oculto:

Código (vbnet) [Seleccionar]
ShowWindow(HwndProcess, 0)

hay que poner 0, para ocultarlo 1 para minimizado y 2 para normal.

Sin embargo una vez oculto (bueno sin ventana) Process.GetProcesses(), no encuentra el proceso. Lo digo por si luego se quiere cambiar el estado a Visible.
Entonces hay que usar otro código para obtener el handle de un proceso sin ventana. Hay algunos por ahí.


pero.... no se si el truquillo funcionaría con todo tipo de procesos, si al hacer clic en el icono es posible maximizar la aplicación o mostrarlo en ventana, en principio si que debería funcionar.

Si la aplicación no está en modo ventana entonces Process.getProcesses no encontrará el handle. Es necesario que esté en modo ventana.,



...Estoy buscando uno que tenía que desactivaba el icono pero no lo encuentro  :(

El método era similar. Me cachis a ver si lo encuentro

Eleкtro

#7
Vamos a ver @okik, él lo que quiere es ocultar el icono del area de notificación, no la ventana principal del proceso, son dos cosas distintas, una ventana Win32 expone un controlador de ventana, pero el botón del área de notificación no.

Aparte, lo de llamar a la función ShowWindow ya lo comenté:
Cita de: Eleкtro en 23 Septiembre 2016, 17:45 PM
Una solución programática podría ser identificar el botoncito que quieres eliminar (si, esos iconos del área de notificación son controles de tipo Button) y seguídamente llamar a la función Win32 ShowWindow, CloseWindow o DestroyWindow o tal vez DestroyIcon, usando la parametización adecuada para ocultar y/o cerrar la ventana.
...fue lo primero que escribí a modo hipótesis, puesto que esa metodología no funcionará sin un identificador disponible.

Saludos!








okik

No es mi intención discutir solo aclarar

A ver, si quiere ocultar el icono de notificación por lógica debe ser porque no quiere que otra persona pueda ver que se está ejecutando dicho programa ¿no? pues la idea es que oculte la aplicación o muestre a su antojo según quiera que se vea o no el icono de notificación.

No con todas las apliciaciones funciona lo de ocultar la ventana. Solo con aquellas que se inician en modo venta y tienen la opción de minimizar en el icono de notificación.

Sin embargo, creo que si que es posible ocultar sólo el icono de notificación usando:

Private Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias " Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long

pero es necesario obtener el ID del icono, que eso ya no se como


nota: creo que yo estaba reeditando mi respuesta cuando tu pusiste la tuya luego no ha sido mi intención pisarte tu respuesta  :-\

Eleкtro

Cita de: okik en 29 Septiembre 2016, 13:24 PMsi quiere ocultar el icono de notificación por lógica debe ser porque no quiere que otra persona pueda ver que se está ejecutando dicho programa ¿no?

Eso es una mera suposición.

De todas formas @okik sinceramente no tiene mucho sentido que sigamos debatiendo este asunto cuando para empezar el usuario que formuló la pregunta no ha vuelto a dar señales de vida (a pesar de haberse conectado recientemente), en mi opinión es mejor que no hagamos más el tonto ofreciendo ayuda en este post investigando algo que implica esfuerzo y escasea de documentación... puesto que probablemente el esfuerzo nunca se verá agradecida ni para ti ni tampoco para mi :-\, al menos eso es lo que haré yo, ignorar este tema.

Saludos!