C# usa la API para enumerar el formulario para encontrar el identificador u obtener el título de la ventana y controlar el contenido que contiene una cadena específica

Pregunta 1: el proyecto necesita encontrar el identificador de PPT y, a veces, no se puede encontrar a través de la coincidencia exacta del título de PPT

Motivo: el título del PPT será diferente de la versión según el punto de PowerPoint. Al mismo tiempo, el título del propio ppt a veces agregará algo de contenido. Por ejemplo, después de completar el PPT, se guardará como versión 97-2003. Aparecerán las palabras [modo de compatibilidad], lo que dificultará la coincidencia exacta

¿Se puede hacer una coincidencia aproximada para obtener el identificador de PPT? La respuesta es sí.

Solución: use API: EnumWindows para enumerar todos los formularios, obtenga el título y luego haga coincidir la cadena que necesita encontrar para obtener el identificador

  const int WM_GETTEXT = 0x000D;
        const int WM_GETTEXTLENGTH = 0x000E;

 [DllImport("User32.dll", EntryPoint = "SendMessage")]
        public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

        [DllImport("user32.dll", EntryPoint = "SendMessage")]
        public static extern int SendMessage(int hwnd, int wMsg, int wParam, Byte[] lParam);

/// <summary>
        /// Título del control de coincidencia aproximada
        /// </summary>
        /// <param name="dimStr">Cadena de coincidencia aproximada</param>
        /// <returns></returns>
        public static IntPtr FindWindowExByDimStrIntoWindow(string dimStr)
        {             IntPtr iResult = IntPtr.Zero;

            string controlTitle = ""; //Título completo del control

            // Enumerar subventanas, encontrar identificadores de control
            int i = EnumWindows(
            (h, l) =>
            {                 int cTxtLen;                 if (IsWindowVisible(h))                 {                     //Procesar cada ventana enumerada                     cTxtLen = SendMessage(h , WM_GETTEXTLENGTH, 0, 0); //Obtener la longitud del contenido                     Byte[] byt = new Byte[cTxtLen];                     SendMessage((int)h, WM_GETTEXT, cTxtLen + 1, byte); //Obtener la                     cadena de contenido str = Encoding.Default .GetString(byt)                     if (str.ToString().Contains(dimStr))                     {                         iResult = h ;











                        controlTitle = str.ToString();
                        falso retorno;
                    }
                    más
                        devuelve verdadero;
                }
                más
                    devuelve verdadero;

            },
            0);

            // devuelve el resultado de la búsqueda
            devuelve iResult;
        }
 

Pregunta 2: en la forma especificada, busque el contenido de texto de la subventana

        /// <summary>
        /// Recorriendo el formulario secundario, buscando el contenido completo del cuadro de texto que contiene la cadena especificada
        /// </summary>
        /// <param name="hwnd">identificador de formulario principal</ param >
        /// <param name="dimStr">Cadena de coincidencia aproximada</param>
        /// <returns></returns>
        public static string FindWindowExByDimStrIntoChildWindow2(IntPtr hwnd, string dimStr)
        {             Log.WriteLog("Ingresar función: FindWindowExByDimStrIntoChildWindow \n");             IntPtr iResult = IntPtr. Zero;

            string controlTitle = ""; //Título completo del control

            // Enumerar subventanas y encontrar identificadores de control
            int i = EnumChildWindows(
            hwnd,
            (h, l) =>
            {                 int TextLen;                 TextLen = SendMessage(h, WM_GETTEXTLENGTH, 0, 0); // Obtener la longitud del contenido                 Byte[] byt = new Byte[TextLen];                 SendMessage((int)h, WM_GETTEXT, TextLen + 1, byt); //Obtener                 cadena de contenido str = Encoding.Default.GetString(byt);                // Log.WriteLog(string.Format( " Editar contenido de control {0}\n", str));                 if (str.ToString().Contains(dimStr))                 {                     iResult = h;                     controlTitle = str.ToString();










                    Log.WriteLog(string.Format("ruta encontrada por coincidencia aproximada {0}\n", controlTitle));
                    devuelve falso;
                }
                de lo contrario,
                    devuelve verdadero;

            },
            0);

            // devuelve el resultado de la búsqueda
            return controlTitle;
        }

Si sabe que el tipo de control es Editar, puede usar la siguiente función

        /// <summary>
        /// Título del control de coincidencia aproximada
        /// </summary>
        /// <param name="hwnd">Manejador de formulario principal</param>
        /// <param name="dimStr"> Fuzzy cadena coincidente</param>
        /// <returns></returns>
        public static string FindWindowExByDimStrIntoChildWindow(IntPtr hwnd, string dimStr)
        {             Log.WriteLog("Ingresar función: FindWindowExByDimStrIntoChildWindow \n");             IntPtr iResult = IntPtr.Zero ;

            string controlTitle = ""; //Título completo del control

            // Enumerar las ventanas secundarias, encontrar el identificador de control
            int i = EnumChildWindows(
            hwnd,
            (h, l) =>
            {

                IntPtr HwndStatue = FindWindowEx(h, 0, "Editar", nulo); //manejador de cuadro de texto 
                StringBuilder title1 = new StringBuilder(200);
                int len1;
                len1 = GetWindowText(h, title1, 200);

                if (HwndStatue != IntPtr.Zero)
                {                     int TextLen;                     TextLen = SendMessage(HwndStatue, WM_GETTEXTLENGTH, 0, 0); //Obtener la longitud del contenido                     Byte[] byt = new Byte[TextLen];                     SendMessage((int)HwndStatue, WM_GETTEXT , TextLen + 1, byt); //Obtener                     cadena de contenido str = Encoding.Default.GetString(byt);                    // Log.WriteLog(string.Format("Editar contenido de control {0}\n", str));                     if (str.ToString().Contains(dimStr))                     {                         iResult = h;                         controlTitle = str.ToString();










                        Log.WriteLog(string.Format("ruta encontrada por coincidencia aproximada {0}\n", controlTitle));
                        devuelve falso;
                    }
                    de lo contrario
                        devuelve verdadero;
                }
                de otro modo
                    devuelve verdadero;

            },
            0);

            // devuelve el resultado de la búsqueda
            return controlTitle;
        }

Supongo que te gusta

Origin blog.csdn.net/yunxiaobaobei/article/details/92970028#comments_25621244
Recomendado
Clasificación