0 / 0 / 0
Регистрация: 29.10.2014
Сообщений: 8
1

Как выбрать пункт в ListBoxe стороннего приложения?

29.10.2014, 12:58. Показов 1147. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Запускаю сторонее приложение
C#
1
2
3
4
5
6
Process fps = new Process();
            fps.StartInfo.UseShellExecute = true;
            fps.StartInfo.RedirectStandardOutput = false;
            fps.StartInfo.FileName = @"FPSPatcher.exe";
            fps.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
            fps.Start();
Там открывается окно в котором есть список. Мне нужно выбрать пункт в этом списке. Как мне это сделать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.10.2014, 12:58
Ответы с готовыми решениями:

Как выбрать пункт меню?
всем привет! подскажите как выбрать пункт меню в другом приложении функциями Win API? пробовал...

Как сделать запуск стороннего приложения
как сделать запуск стороннего приложения. В bat файле это выглядит вот так вот: start...

Как завершить процесс стороннего приложения
Например есть какойто запущеный процес "pro", путь - "D:\pro.exe". Какой код, чтоб проверить...

Как закрыть окно стороннего приложения
Доброго времени суток! Хочу узнать, как написать программу на c++, которая закрывает чужое окно...

4
1242 / 1052 / 293
Регистрация: 07.03.2012
Сообщений: 3,245
29.10.2014, 13:04 2
только через винапи
1
0 / 0 / 0
Регистрация: 29.10.2014
Сообщений: 8
29.10.2014, 13:35  [ТС] 3
Ага, спасибо!! Сделал импорт из user32.dll.

C#
1
2
3
4
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
("user32.dll", SetLastError = true)]
 static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string @class, string window);

Ищу свое приложение

C#
1
IntPtr fpsHandle = FindWindow("", "FPS Patcher");
Но пока никак не могу найти как работать с listbox'ом там...
0
[Bicycle Reinventor]
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
29.10.2014, 14:33 4
Список List Box Messages
Копать конкретно в сторону LB_SELECTSTRING, LB_SETCURSEL или LB_SETSEL
1
0 / 0 / 0
Регистрация: 29.10.2014
Сообщений: 8
29.10.2014, 17:45  [ТС] 5
Сделал вот так. Чтобы получить кол-во строк в listboxe

C#
1
2
3
4
5
            IntPtr fpsHandle = FindWindow(null, "FPS Patcher");//Окно находит
 
            Thread.Sleep(2000);
            int retInfo = GetListBoxInfo(fpsHandle);//В listboxe значения есть. 
            Console.WriteLine(retInfo);
Но показывает 0. Почему?

Добавлено через 32 минуты
Не правильное имя задавал. С помощью spy++ узнал название списка.
Нашел его так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
            Process fps = new Process();
            fps.StartInfo.UseShellExecute = true;
            fps.StartInfo.RedirectStandardOutput = false;
            fps.StartInfo.FileName = @"FPSPatcher.exe";
            fps.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
            fps.Start();
 
            Thread.Sleep(1000);
            IntPtr fpsHandle = FindWindowEx(IntPtr.Zero, IntPtr.Zero, null, "FPS Patcher");
            //IntPtr fpsHandle = FindWindow(null, "FPS Patcher");
            Console.WriteLine(fpsHandle + " - fpsHandle");
 
            IntPtr listBox = FindWindowEx(fpsHandle, IntPtr.Zero, "TListBox", null);
            Console.WriteLine(listBox + " - TListBox");
 
            Thread.Sleep(2000);
            int retInfo = GetListBoxInfo(listBox);
            Console.WriteLine(retInfo + " - пункты");
 
            IntPtr RetVal = SendMessage(retInfo, LB_SELECTSTRING, 0, 0);
Но у меня ругается на LB_SELECTSTRING. Ему надо значение выставить, а я не могу понять какое значение выставлять. Как это определяется?

Добавлено через 43 минуты
Нашел значение LB_SELECTSTRING. Выставляю его так.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
[DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr GetWindow(IntPtr hWnd, GetWindow_Cmd uCmd);
 
        enum GetWindow_Cmd : uint
        {
            LB_SELECTSTRING = 396//Значение взял из [url]http://referencesource.microsoft.com/#System.Design/System/Design/NativeMethods.cs[/url]
        }
 
........
 
            IntPtr LB_SELECTSTRING = GetWindow(listBox, GetWindow_Cmd.LB_SELECTSTRING);
 
            IntPtr RetVal = SendMessage(listBox, LB_SELECTSTRING, 1, 0);
Насколько я понимаю должно отметиться первое значение, но ни фига не происходит. Не пойму что не так делаю...

Добавлено через 48 минут
Всем спасибо кто помог. Все получилось, осталось небольшие мелочи поправить. Вот код который я написал.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Threading;
using System.Runtime.InteropServices;
 
namespace ConsoleApplication1
{
    class Program
    {
        //Экспорт функций из ДЛЛ для использования WinApi
        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string @class, string window);
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, string lParam);
        [DllImport("user32.dll")]
        static extern int GetListBoxInfo(IntPtr hwnd);
 
        static void Main(string[] args)
        {
//Запуск клиент игры
            Process uo = new Process();
            uo.StartInfo.UseShellExecute = true;
            uo.StartInfo.RedirectStandardOutput = false;
            uo.StartInfo.FileName = @"2d1.exe";
            uo.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
            uo.Start();
 
//Ожидаем 2 сек. С надеждой что он успеет запуститься за это время. Пока не понял как узнать что приложение запустилось.
            Thread.Sleep(2000);
 
//Запускаем патчер клиента игры
            Process fps = new Process();
            fps.StartInfo.UseShellExecute = true;
            fps.StartInfo.RedirectStandardOutput = false;
            fps.StartInfo.FileName = @"FPSPatcher.exe";
            fps.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
            fps.Start();
 
//Ожидаем 2 сек. С надеждой что он успеет запуститься за это время.
            Thread.Sleep(2000);
 
//Ищем окно с именем "FPS Patcher"
            IntPtr fpsHandle = FindWindowEx(IntPtr.Zero, IntPtr.Zero, null, "FPS Patcher");
            //IntPtr fpsHandle = FindWindow(null, "FPS Patcher");
            Console.WriteLine(fpsHandle + " - fpsHandle");
 
//Ищем в окне список позиций. Название элемента списка получил через программу Spy++
            IntPtr listBox = FindWindowEx(fpsHandle, IntPtr.Zero, "TListBox", null);
            Console.WriteLine(listBox + " - TListBox");
 
//Проверяем сколько там пунктов. В дальнейшем тут должен быть цикл ожидания его загрузки
            int retInfo = GetListBoxInfo(listBox);
            Console.WriteLine(retInfo + " - пунктов");
 
//Значения команд. Значения команд взял с этой страницы [url]http://referencesource.microsoft.com/#System.Design/System/Design/NativeMethods.cs[/url] и перевел их в int32 на инженерном калькуляторе
            Int32 LB_SELECTSTRING = 0x018C;
            Int32 WM_LBUTTONDOWN = 0x0201;
            Int32 WM_LBUTTONUP = 0x0202;
 
//Выбираем пункт с названием "Ultima Online"
            SendMessage(listBox, LB_SELECTSTRING, -1, "Ultima Online");
 
//Нажимаем на этот пункт левой кнопкой мыши
            SendMessage(listBox, WM_LBUTTONDOWN, 1, "Ultima Online");
 
//Отжимаем левую кнопку мыши
            SendMessage(listBox, WM_LBUTTONUP, 0, "Ultima Online");
 
//Ищем кнопку запуска патчера
            IntPtr tButton = FindWindowEx(fpsHandle, IntPtr.Zero, "TButton", "Set Patch");
 
//Работаем с кнопками мыши
            SendMessage(tButton, WM_LBUTTONDOWN, 1, null);
            SendMessage(tButton, WM_LBUTTONUP, 0, null);
 
//Чтобы консоль не закрывалась, потом будет убрано.
            Console.ReadKey();
        }
 
    }
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.10.2014, 17:45
Помогаю со студенческими работами здесь

Как захватить контекст стороннего приложения?
А точнее, как установить свой фреймрейт для любого стороннего окна, использующего DX3D9? Ну или...

Как приостановить работу стороннего приложения
Ребят СРОЧНО нужна помощь! Нужна заморозка и открытие какого либо Проэкта или Программы!...

Как считать данные из стороннего приложения?
Привет всем! Я работаю на лазерном комплексе под управлением китайской софтины CypCut Laser Cutting...

Как поставить флажок в окне стороннего приложения
Как средствами c# можно замутить такое? (: Пример: поставить галочку на определенное действие


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru