Форум программистов, компьютерный форум, киберфорум
C#: API, боты
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 14.10.2020
Сообщений: 4
1

Получить текст из окна стороннего приложения

14.10.2020, 23:22. Просмотров 1706. Ответов 6
Метки нет (Все метки)

Здравствуйте! Пытаюсь получить текст из окна чата стороннего приложения. Окно не пустое. Получила дескриптор окна по имени класса. Далее
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 public string GetControlText(IntPtr hWnd)
        {
 
            // Get the size of the string required to hold the window title (including trailing null.) 
            Int32 titleSize = SendMessage((int)hWnd, WM_GETTEXTLENGTH, 0, 0).ToInt32();
 
            //If titleSize is 0, there is no title so return an empty string(or null)
            if (titleSize == 0)
                return String.Empty;
 
            StringBuilder title = new StringBuilder(titleSize+1);
 
            SendMessage(hWnd, (int)WM_GETTEXT, title.Capacity, title);
          
            return title.ToString();
        }
Но результат - пустая строка. Причем, когда тестировала этот код на простом приложении, где нужно извлечь данные из текстбокса на форме - все работает. В чем может быть проблема?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2020, 23:22
Ответы с готовыми решениями:

Считать текст из окна стороннего приложения
Здравствуйте. Скажите пожалуйста как считать текст из таких окон как прикреплены к сообщению?????

Получить координаты окна стороннего приложения
Здравствуйте дорогие форумчане, встал вопрос как получить координаты СТОРОННЕЙ программы , при...

Получить дескриптор окна стороннего приложения и контекстного меню
Здравствуйте. Подскажите пожалуйста. Как можно словить дескриптор выскакивающего окна? в списке...

Получить содержимое и/или элементы окна стороннего приложения
Подскажите, возможно ли с помощью C# (в том числе winapi) получить сабж?

6
66 / 48 / 21
Регистрация: 14.08.2020
Сообщений: 133
15.10.2020, 00:07 2
Проверьте , что дескриптор окна не равен null. И что значит окно не пустое? Если сообщения чата выводятся в текстовом поле, значит нужно послать WM_GETTEXT с помощью SendMessage текстовому полю , а не окну , предварительно получив дескриптор текстового поля.
... и не факт что сработает, мало ли как там сообщения отрисовываются.
0
0 / 0 / 0
Регистрация: 14.10.2020
Сообщений: 4
15.10.2020, 07:46  [ТС] 3
Проверила, не null.
Окно не пустое - имелось в виду, что окно чата не пустое.
Нашла все дочерние элементы нужного окна и имена классов. При помощи Spy++ нашла имя класса для компонента, в который выводятся сообщения. Похоже,это какой то самописный компонент. Нужный мне компонент один такой на форме. Далее пыталась вытащить текст, как указано выше.

C#
1
2
3
4
  Int32 titleSize = SendMessage((int)hWnd, WM_GETTEXTLENGTH, 0, 0).ToInt32();
        
            if (titleSize == 0)
                return String.Empty;
Вот в этой части получаем 0.
0
66 / 48 / 21
Регистрация: 14.08.2020
Сообщений: 133
15.10.2020, 12:25 4
Хоть скриншотом показали бы что ли. может понятнее стало бы.
Окно чата это списочный элемент? Может листбокс какой-нибудь, тогда и сообщения отправлять соответствующие нужно. получить handle листбокса и перебрать все строки, типа :
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
     IntPtr formHwnd =  // дескриптор окна
            //найти  в окне список 
            IntPtr listBoxHwnd = FindWindowEx(formHwnd, IntPtr.Zero, "listBoxClassName", "");
 
            if (listBoxHwnd != IntPtr.Zero)
            {
                // количество строк листбокса
                int itemsCount = SendMessage(listBoxHwnd, LB_GETCOUNT, 1, 0);
 
                for (int i = 0; i < itemsCount; i++)
                {
                    // длина текста в строке
                    var textLength = SendMessage(listBoxHwnd, LB_GETTEXTLEN, i, 0);
                    StringBuilder sb = new StringBuilder(textLength);
                    // получить текст из строки 
                    SendMessage(listBoxHwnd, LB_GETTEXT, i, sb);
 
                    // что-то делаем с текстом 
                    string text = sb.ToString();
                }
            }
C#
1
2
3
4
5
6
7
8
9
10
11
12
        const int LB_GETCOUNT = 0x018B;
        const int LB_GETTEXT = 0x0189;
        const int LB_GETTEXTLEN = 0x018A;
 
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string className, string windowName);
 
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
 
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, StringBuilder lParam);
1
0 / 0 / 0
Регистрация: 14.10.2020
Сообщений: 4
15.10.2020, 21:18  [ТС] 5
К сожалению, скриншот не могу прислать. В том то и дело, что компонент какой то самописный. Да, списочный элемент. При помощи Spy++ проверила имя класса ("ChatClass") и дескриптор. В коде они определяются правильно. Но вытащить данные пока не получилось.
0
66 / 48 / 21
Регистрация: 14.08.2020
Сообщений: 133
16.10.2020, 10:38 6
scorpius12345, ну выход всегда есть: OCR или инжектиться в процесс и перехватывать сообщения посылаемые окну .
1
0 / 0 / 0
Регистрация: 14.10.2020
Сообщений: 4
16.10.2020, 11:22  [ТС] 7
access_now, спасибо Вам. Вечером попробую разобраться. Я, честно говоря, ранее с этим не работала, поэтому в теме полный ноль.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.10.2020, 11:22

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Получить текст компонента стороннего приложения
Добрый день! Подскажите, пожалуйста, есть у меня чужая программа, точно знаю что написана на...

Получить текст из RichEdit стороннего приложения
Есть приложение, на котором расположен в поле RichEdit. Имя класса окна, которое возвратил InqSoft...

Как получить hWnd окна стороннего приложения, которое свёрнуто в трей
Здравствуйте, есть такая функция, как IsWindowVisible, которая может вычислять, свернуто окно...

Перемещение окна стороннего приложения
Среда - WindowsXP Программе известен дескриптор окна стороннего приложения. Как переместить...

Развёртывание окна стороннего приложения
Мне необходим метод, который будет разворачивать окно скайпа. ИЛи скажите что я не так написал...

Закрепление окна стороннего приложения
Пожалуйста подскажите, а лучше с примером. Как реализовать следующее: 1.жму на Form1...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.