Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: TomaSs en 20 Agosto 2013, 00:32 am



Título: Evitar activación de ventana externa
Publicado por: TomaSs en 20 Agosto 2013, 00:32 am
Hola chicos.

Pues vengo a haceros una preguntilla para ver si me podéis echar una manita ;)
El tema es que estoy probando con la calculadora de windows a ver si conseguía lograr lo que digo en el título de este hilo. La cuestión sería clicar en cualquier botón de la calculadora y que esta reciba los clics y responda a los botones presionados, pero que no se active su ventana (que la ventana no coja el foco).
Estoy tratando de hacer un hook a WH_CALLWNDPROC para capturar cuando se llama a WM_ACTIVATEAPP y seguidamente ya intentaría invalidarlo, pero el tema es que no me hace el hook.

Este sería parte del código que estoy utilizando, pero no se porqué no me engancha el hook, a ver si sabríais decirme que estaría mal:

Código:
private void Iniciar_Hook()
        {
            try
            {
                HookProc HookDelegado = new HookProc(HookProcHandler);

                if (hook.Equals(IntPtr.Zero))
                {
                    Console.Beep();
                    IntPtr hwndWindow = FindWindowByCaption(IntPtr.Zero, "Calculadora");
                    //MessageBox.Show(hwndWindow.ToString());
                    hook = SetWindowsHookEx(HookType.WH_CALLWNDPROC, HookDelegado, hwndWindow, 0);
                    MessageBox.Show(hook.ToString()); //Muestra 0
                    bt_boton1.Text = "STOP";
                }
                else
                {
                    UnhookWindowsHookEx(hook);
                    hook = IntPtr.Zero;
                    bt_boton1.Text = "GO";
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Error en el Hook: \n" + e.Message);
            }
        }

private IntPtr HookProcHandler(int code, WM wParam, KBDLLHOOKSTRUCT lParam)
        {
            try
            {
                MessageBox.Show("hola1");
                if (code >= 0 && (lParam.Equals(WM.ACTIVATEAPP) || lParam.Equals(WM.ACTIVATE)))
                {
                    //MessageBox.Show("hola2");
                    //Console.Beep();
                }
                return CallNextHookEx(IntPtr.Zero, code, wParam, lParam);
            }
            catch (Exception e)
            {
                MessageBox.Show("Error en el Hook: \n" + e.Message);
            }
            return (IntPtr)1;
        }

También decir que me ejecuta el programa y tal, por lo que la declaración de funciones etc no es problema, el tema es que no me hace el hook. No se si será que los parámetros de HookProcHandler deberían ser otros al tratarse de hacer un hook a WH_CALLWNDPROC o no se, porque cuando hago el hook a WH_KEYBOARD_LL si que me lo hace perfectamente...

Muchas gracias como siempre!!! ;)