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;
}