// 
// Copyright 2016 Agencia Estatal de Administración Tibutaria
//
// Licencia con arreglo a la EUPL, Versión 1.1 o -en cuanto
// sean aprobadas por la Comisión Europea- versiones
// posteriores de la EUPL (la «Licencia»);
// Solo podrá usarse esta obra si se respeta la Licencia.
// Puede obtenerse una copia de la Licencia en:
//  
// https://joinup.ec.europa.eu/software/page/eupl
//  
// Salvo cuando lo exija la legislación aplicable o se acuerde
// por escrito, el programa distribuido con arreglo a la
// Licencia se distribuye «TAL CUAL», SIN GARANTÍAS NI CONDICIONES
// DE NINGÚN TIPO, ni expresasni implícitas.
//
// Véase la Licencia en el idioma concreto que rige los permisos y 
// limitaciones que establece la Licencia.
// 

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace ateneo.utiles
{
    class Win32Apis
    {
        [DllImport("user32.dll")]
        [return:MarshalAs(UnmanagedType.Bool)]
        private static extern bool SetForegroundWindow(IntPtr hwnd);

        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
        
        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, IntPtr windowTitle);
        
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
        
        [DllImport("user32.dll", SetLastError = true)]
        static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
        
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
        static extern IntPtr SendMessage(IntPtr hWnd, Int32 Msg, IntPtr wParam, IntPtr lParam);
        
        public static void bringToFront(Form form) {
            SetForegroundWindow(form.Handle);
        }

        public static string textoParaMostrar = "";

        public static uint obtenerPidVentana(int hwnd) {
            uint pId;
            GetWindowThreadProcessId((IntPtr)hwnd, out pId);
            return pId;
        }

        public static IntPtr encontrarMsgBox(uint pIdBuscado) {
            IntPtr ptr = IntPtr.Zero;
            do {
                ptr = FindWindowEx(IntPtr.Zero, ptr, "#32770", IntPtr.Zero);
                if (ptr != IntPtr.Zero) {
                    uint pId;
                    GetWindowThreadProcessId(ptr, out pId);
                    if (pId == pIdBuscado) {
                        StringBuilder total = new StringBuilder(2000);
                        IntPtr ptHijo = IntPtr.Zero;
                        do {
                            ptHijo = FindWindowEx(ptr, ptHijo, "Static", IntPtr.Zero);
                            if (ptHijo != IntPtr.Zero) {
                                StringBuilder sb = new StringBuilder(1000);
                                GetWindowText(ptHijo, sb, sb.Capacity);
                                if (sb.Length > 0) total.Append(sb).Append("\n");
                            }
                        } while (ptHijo != IntPtr.Zero);
                        textoParaMostrar = total.ToString();
                        return ptr;
                    }
                }
            } while (ptr != IntPtr.Zero);

            return IntPtr.Zero;
        }

        public static void cerrarMsgBox(IntPtr hwnd) {
            SendMessage(hwnd, 0x10, IntPtr.Zero, IntPtr.Zero);
        }

        public static bool procesarAlertasDeExplorer(uint pId) {
            IntPtr ptr = encontrarMsgBox(pId);
            if (ptr != IntPtr.Zero) {
                cerrarMsgBox(ptr);
                System.Windows.Forms.MessageBox.Show(textoParaMostrar, "Mensaje de Internet Explorer",
                    System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Exclamation);
                return true;
            }
            return false;
        }
        public static void ignorarAlertasDeExplorer(uint pId) {
            IntPtr ptr = encontrarMsgBox(pId);
            if (ptr != IntPtr.Zero) {
                cerrarMsgBox(ptr);
            }
        }
    }
}
