Я пытаюсь автоматизировать последовательность пользовательских вводов в скомпилированное приложение на C # с использованием Win32 API. У меня нет исходного кода для приложения, которым я пытаюсь управлять, и оно работает, пока я пытаюсь его контролировать. В моем коде у меня есть одна кнопка, при нажатии которой необходимо выполнить последовательность из 3 входов в приложение, которым я пытаюсь управлять:
- Выберите элемент в виде дерева
- Нажмите кнопку
- Нажмите другую кнопку
Как это работает, кнопка на шаге 2 выполняет действие в зависимости от элемента, выбранного в древовидной структуре на шаге 1. Я могу заставить кнопки работать так же просто, просто отправив сообщение, но не могу понять как выбрать нужный элемент TreeView. TreeView является статическим, поэтому элементы и макет никогда не изменятся. Имеет следующую компоновку:
-itemsA
-itemsB
--itemB1
-itemsC
Где itemB1 - это элемент, который необходимо выбрать, чтобы сработали нажатия кнопок на шагах 2 и 3. По умолчанию ItemsB свернут, поэтому мне, вероятно, нужно расширить его, прежде чем я смогу выбрать ItemB1? Вот мой код Я действительно ценю любую помощь !!
//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
Ганс, * * тысяча двадцать-одна
Можете ли вы дать мне пример того, как я это сделаю? Проблема, которую я действительно испытываю, заключается в поиске дескриптора для элемента дерева, который я хочу выбрать. Если я использую Spy ++, чтобы найти текущий дескриптор и жестко закодировать его в своем методе, он работает нормально, например:
SendMessage((int)treeChild, TV_SELECTITEM, TVGN_CARET, (IntPtr)0x092DCB30);
Если я использую SendMessage и отправляю TVGN_ROOT в дескриптор TreeView, он вернет IntPtr с дескриптором для элемента, который нужно выбрать в древовидном представлении, или как это работает? Я также экспериментирую с AutoIt, но я надеялся сохранить весь мой код в одном приложении.