Estoy tratando de automatizar una secuencia de entradas de usuario a una aplicación compilada en C# utilizando Win32 API. No tengo ningún código fuente para la aplicación que estoy tratando de controlar y se está ejecutando mientras trato de controlarlo. En mi código, tengo un solo botón que, al hacer clic, tiene que hacer una secuencia de 3 entradas a la aplicación que estoy tratando de controlar:Cómo seleccionar un elemento en un TreeView usando Win32 API
- seleccionar un elemento en una vista de árbol
- Haga clic en un botón de
- Haga clic en otro botón
la forma en que funciona es el botón en el paso 2 realiza una acción en función del elemento seleccionado en la vista de árbol en el paso 1. soy capaz de obtener el botón de clics para funcionar bien con sólo enviando un mensaje, pero no puedo encontrar la manera de seleccionar el elemento TreeView que quiero. TreeView es estático, por lo que los elementos y el diseño nunca cambiarán. Tiene la siguiente distribución:
-itemsA
-itemsB
--itemB1
-itemsC
Dónde itemB1 es el elemento que necesita ser seleccionados con el fin de que el botón de en los pasos 2 y 3 trabajar. Por defecto, ItemsB está contraído, por lo que probablemente necesite expandirlo antes de poder seleccionar ItemB1. Aquí está mi código. ¡¡Realmente aprecio cualquier ayuda!!
//Find Window API
[DllImport("User32.dll")]
public static extern Int32 FindWindow(String lpClassName, String lpWindowName);
//Find WindowEx API
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
//Send Message API
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int SendMessage(int hWnd, int msg, int wParam, IntPtr lParam);
private const int BN_CLICKED = 245;
//Method called by button click
public static void Start()
{
int hwnd = 0;
int prod = 0;
IntPtr hwndChild = IntPtr.Zero;
IntPtr treeChild = IntPtr.Zero;
IntPtr prodChild = IntPtr.Zero;
hwnd = FindWindow(null, "Application");
if (hwnd > 0)
{
//Get Handle for TreeView, THIS IS WHERE I AM STUCK!!
treeChild = FindWindowEx((IntPtr)hwnd, IntPtr.Zero, "AfxMDIFrame80", null);
treeChild = FindWindowEx((IntPtr)treeChild, IntPtr.Zero, "AfxMDIFrame80", null);
treeChild = FindWindowEx((IntPtr)treeChild, IntPtr.Zero, "SysTreeView32", null);
//Need to Add code to select item in TreeView ???
//Click First Button
hwndChild = FindWindowEx((IntPtr)hwnd, IntPtr.Zero, "AfxMDIFrame80", null);
hwndChild = FindWindowEx((IntPtr)hwndChild, IntPtr.Zero, "AfxMDIFrame80", null);
hwndChild = FindWindowEx((IntPtr)hwndChild, IntPtr.Zero, "#32770", null);
IntPtr scanBtn = FindWindowEx((IntPtr)hwndChild, IntPtr.Zero, "Button", "&Scan");
SendMessage((int)scanBtn, BN_CLICKED, 0, IntPtr.Zero);
//Click Second Button
prod = FindWindow("#32770", "Product: WPC");
prodChild = FindWindowEx((IntPtr)prod, IntPtr.Zero, "Button", "&Collect");
SendMessage((int)prodChild, BN_CLICKED, 0, IntPtr.Zero);
}
}//END Start
Hans,
¿Me puede dar un ejemplo de cómo iba a hacerlo? El problema que realmente estoy teniendo es encontrar el identificador para el elemento TreeView que quiero seleccionar. Si uso Spy ++ para encontrar la manija actual y codificar en mi método, que funciona bien, como esto:
SendMessage((int)treeChild, TV_SELECTITEM, TVGN_CARET, (IntPtr)0x092DCB30);
si uso SendMessage y enviar TVGN_ROOT a la manija TreeView, va a devolver un IntPtr con el mango para el elemento a seleccionar en la vista de árbol, o cómo funciona eso? También estoy experimentando con AutoIt, pero esperaba mantener todo mi código en una sola aplicación.
¿Puede darme un ejemplo de cómo haría esto? El problema que realmente estoy teniendo es encontrar el identificador para el elemento TreeView que quiero seleccionar. Si utilizo Spy ++ para encontrar el controlador actual y codificarlo en mi método, funciona bien, así: SendMessage ((int) treeChild, TV_SELECTITEM, TVGN_CARET, (IntPtr) 0x092DCB30); Si uso SendMessage y envío TVGN_ROOT al Mango TreeView, ¿devolverá un IntPtr con el asa del elemento para seleccionar en la vista de árbol, o cómo funciona eso? También estoy experimentando con AutoIt, pero esperaba mantener todo mi código en una sola aplicación. – user441603
TVGN_ROOT es una bandera, no un mensaje. TVM_GETNEXTITEM es el mensaje. Si desea ayuda con su código, publíquelo en su pregunta. –
Mi error. Primera publicación en el foro. – user441603