Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 1
Регистрация: 25.02.2013
Сообщений: 33

Хук на функцию TextOutW - получение текста метки другого приложения

21.08.2014, 18:33. Показов 2168. Ответов 16
Метки qt (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую господа,
Есть у меня стороннее приложение, написанное на С++ в среде Qt. Я хочу выдрать текст из одного label'a этой проги. Читал, что это можно сделать, если поставить хук на функцию TextOutW. Хотелось бы узнать как подобное реализуется на с#.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.08.2014, 18:33
Ответы с готовыми решениями:

Получение выделенного текста из другого приложения
Помоги написать небольшую программу, которая будет отлавливать выделение строк таблицы в другом приложении. Сам ни разу не писал на...

Получение Label из другого приложения
Как получить Label из другой программы?

Получение данных с окна другого приложения
Добрый день! С WinApi знаком не долго и поэтому прошу помощи в решении такой задачки: Есть приложение, в окне которого выводится...

16
 Аватар для Петррр
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
21.08.2014, 20:46
Acros Organics, если приложение написано с использованием Qt(Qt Widgets или QML), то нет никаких гарантий, что надпись выводится через функцию TextOutW. Насколько я знаю, с помощью того же Qt можно перехватывать сигналы в другом приложении, использовать C# для этих целей бессмысленно.

Что подразумевается под «среда Qt»? Есть Qt Creator - это среда разработки, есть Qt - фреймворк для написания кроссплатформенных приложений.
0
0 / 0 / 1
Регистрация: 25.02.2013
Сообщений: 33
21.08.2014, 21:34  [ТС]
Цитата Сообщение от Петррр Посмотреть сообщение
Что подразумевается под «среда Qt»? Есть Qt Creator - это среда разработки, есть Qt - фреймворк для написания кроссплатформенных приложений.
Точно не могу сказать. К выводу, что использовался Qt, я пришел потому, что все объекты на форме имеют класс QWidget (прогонял в Inspect Objects).
0
 Аватар для Петррр
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
21.08.2014, 21:38
Acros Organics, это, скорее всего Qt Widget. Проще спросить какого-нибудь специалиста по Qt - Avazart
1
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.08.2014, 22:14
Ну да в Qt "не виндовые окна" они рисуются "по своему", так что думаю с помощью WinApi хуков не решить.

Добавлено через 20 минут
Цитата Сообщение от Петррр Посмотреть сообщение
если приложение написано с использованием Qt(Qt Widgets или QML), то нет никаких гарантий, что надпись выводится через функцию TextOutW.
Теоретически может рисоваться OpenGL/DirectX.
Но думаю нужно попробовать с конкрентым приложением тогда можно будет что-то сказать.

Acros Organics, Приложение ваше ? Если есть исходники то вероятно легче добавить код для обмена сообщениями и пересобрать приложение на Qt это будет куда более лучшим решением чем ставить хуки или инжектить.
0
0 / 0 / 1
Регистрация: 25.02.2013
Сообщений: 33
21.08.2014, 22:34  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Приложение ваше ?
Приложение не мое. Думаю, что придется делать скрины и писать OCR.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.08.2014, 22:37
Вполне возможно, как вариант, но думаю есть смысл сначала попробовать с хуками.
0
0 / 0 / 1
Регистрация: 25.02.2013
Сообщений: 33
21.08.2014, 22:44  [ТС]
Avazart, у вас есть пример кода, как это реализуется. Единственное, что я нашел по теме это вот этот форум http://bbs.vbstreets.ru/viewto... 1&start=30. Однако, пример jangle не хочет работать под Win 7 да и написан он на паскале
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.08.2014, 22:48
Нет у меня нет, примера кода, более того я никогда не занимался хуками.
Но вот недавно стал интересоваться ибо потребовалось, читаю сейчас книгу Рихтера.

Цитата Сообщение от Acros Organics Посмотреть сообщение
Однако, пример автора не хочет работать под Win 7 да и написан он на паскале
А пробовали от админа запускать?
0
0 / 0 / 1
Регистрация: 25.02.2013
Сообщений: 33
21.08.2014, 22:50  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
А пробовали от админа запускать?
Пробовали, еще пробовали запускать в режиме совместимости с win xp - не робит
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.08.2014, 23:01
Цитата Сообщение от Acros Organics Посмотреть сообщение
да и написан он на паскале
Та вроде бейсик
Добавлено через 59 секунд
Visual Basic
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
$UniqueName = "My Hook"
#Compile Dll "HookD.Dll"
#Register None
#Dim All
#Include "Win32Api.Inc"
 
Global  hCallBackProc As Long
Global hInstDLL As Long, MainDll As Long
 
Declare Function VB_Function( txt As String) As Long
Declare Function GetHw(ByVal txt As String) As Long
 
Function SetHookProc(Op As Long) As Long
    Static hProc As Long, tProc As String
    Local hLib As Long
    If hProc = 0 Then
    hLib = GetModuleHandle("gdi32.dll")
    hProc = GetProcAddress(hLib, "TextOutW")
    tProc = Peek$(hProc, 7)
    If IsFalse(VirtualProtect (ByVal hProc, 7, ByVal %PAGE_EXECUTE_READWRITE, ByRef hLib)) Then _
    MsgBox "Error in VirtualProtect": hProc = 0: Exit Function
    End If
    If Op = 1 Then Poke$ hProc, Chr$(&HB8) + Mkl$(CodePtr(MyTextOut)) + Chr$(&HFF, &HE0)
    If Op = 2 Then Poke$ hProc, tProc
    FlushInstructionCache GetCurrentProcess, ByVal hProc, ByVal 7
End Function
 
 
Function MyTextOut (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As Dword, ByVal nCount As Long) As Long
    Local MyString As String
    Static GetStr As String
    If lpString Then MyString = Peek$(lpString, nCount)
    SetHookProc 2
    MyString=Space$(nCount*2)
    MyString= Peek$(lpString, nCount*2)
    MyString=ACode$(MyString)
    Local gui As GUITHREADINFO
    Local R As Long
    gui.cbSize = SizeOf(GUITHREADINFO)
    GetGUIThreadInfo ThreadID, gui To r
    Local hProcess         As Long
    hProcess = FindWindow("TForm1", ByCopy "Form1")
    If hProcess=GUI.hwndActive And hProcess<>0  Then
           hProcess = FindWindow("", ByCopy "MY HOOK")
           hProcess = FindWindowEx(hProcess,0,"ThunderRT6TextBox","")
           GetStr=GetStr+MyString
           SendMessage hProcess, %WM_SETTEXT, 0, StrPtr(GetStr)
           hProcess=0
    End If
    TextOut hdc, x, y, ByVal StrPtr(MyString), Len(MyString)
    SetHookProc 1
End Function
 
 
Function LibMain(ByVal hInstance As Long, ByVal fwdReason As Long, ByVal lpvReserved As Long) Export As Long
    Select Case fwdReason
        Case %DLL_PROCESS_ATTACH: hInstDLL = hInstance: LibMain = 1: SetHookProc 1
        Case %DLL_PROCESS_DETACH: LibMain = 1: SetHookProc 2
    End Select
End Function
 
Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) Export As Long
    Static hHook As Long, hDlg As Long
    hDlg = FindWindow("", $UniqueName)
    If hHook = 0 Then If hDlg Then hHook = GetProp(hDlg, ByVal 1)
    If hHook Then Function = CallNextHookEx(ByVal hHook, ByVal nCode, ByVal wParam, ByVal lParam)
    If IsFalse(MainDll) And (IsFalse(hDlg) Or IsFalse(hHook)) Then FreeLibrary hInstDll
End Function
 
 
Function SetHook Alias "SetHook" ( hWnd As Long) Export As Long
    Local hHook As Long
    hHook = SetWindowsHookEx (%WH_CBT, CodePtr(HookProc), ByVal hInstDLL, ByVal 0)
    SetProp hWnd, ByVal 1, ByVal hHook
    MainDll = 1
End Function
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
24.08.2014, 10:55
Цитата Сообщение от Acros Organics Посмотреть сообщение
Есть у меня стороннее приложение, написанное на С++ в среде Qt. Я хочу выдрать текст из одного label'a этой проги. Читал, что это можно сделать, если поставить хук на функцию TextOutW. Хотелось бы узнать как подобное реализуется на с#.
Через AutomationElement :
Наводим курсор на нужный лэйбл в Qt приложении, у себя на форме в текстбокс получаем текст.

Основное:
System.Drawing.Point mouse = System.Windows.Forms.Cursor.Position;
var autoelement = AutomationElement.FromPoint(new System.Windows.Point(mouse.X, mouse.Y));
textBox1.Text = element.Current.Name ;


Нужны ссылки на сборки UIAutomationTipes, UIAutomationClient, WindowsBase


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
using System;
using System.ComponentModel;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;
using System.Windows.Automation;
using System.Windows.Automation.Text;
using System.Runtime.InteropServices;
 
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            _backgroundWorker.DoWork += _backgroundWorker_DoWork;
            _backgroundWorker.RunWorkerAsync();
        }
 
        BackgroundWorker _backgroundWorker = new BackgroundWorker();
 
        private void SetText(System.Drawing.Point mouse, AutomationElement element)
        {
            if (textBox1.InvokeRequired)
            {
                MethodInvoker del = delegate
                {
                    SetText(mouse, element);
                };
                textBox1.Invoke(del);
                return;
            }
 
            textBox1.Text = element.Current.Name ;
        }
    
        void _backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            do
            {
                try
                {
                    System.Drawing.Point mouse = System.Windows.Forms.Cursor.Position; 
                    var autoelement = AutomationElement.FromPoint(new System.Windows.Point(mouse.X, mouse.Y));
 
                    if (autoelement != null)
                    {
                        SetText(mouse, autoelement);
                    }
                }
             
                catch (Exception ex)
                {
                    textBox1.Text = ex.Message;
                }
                Thread.Sleep(100);
 
            }
            while (true);
        }
 
    }
исправил очепятки
3
 Аватар для Петррр
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
24.08.2014, 11:35
MrCold, Вы код тестировали на Qt приложениях?
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
24.08.2014, 13:34
ну да, конечно .
0
0 / 0 / 1
Регистрация: 25.02.2013
Сообщений: 33
26.08.2014, 23:49  [ТС]
MrCold, спасибо за такое решение. Хотя прога работает с объектами последнего Qt creator'a (v 5.3.1), она не справляется с моим софтом.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
26.08.2014, 23:53
Цитата Сообщение от Acros Organics Посмотреть сообщение
Хотя прога работает с объектами последнего Qt creator'a (v 5.3.1)
MrCold, Каким образом она может видеть окна Qt?
0
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
27.08.2014, 12:01
Цитата Сообщение от Avazart Посмотреть сообщение
MrCold, Каким образом она может видеть окна Qt?
UI Automation не использует hwnd напрямую , информацию по UI предоставляет соответствующий провайдер , так оно легко справляется с WPF приложениями , где тоже чистая графика.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.08.2014, 12:01
Помогаю со студенческими работами здесь

Получение данных другого приложения (отловить звонок в Skype)
Доброе утро, я у вас хотел узнать, как можно получит информацию с другой программы, к примеру вот есть Skype и когда в него звонят, моя...

Парсинг текста с другого приложения
Привет всем , как спарсить HWID с другого приложения? Например : 1 ехе - vasya.exe (delphi) в нем есть 1 едит HWID Накрываем его...

Получение текста из стороннего приложения
Всем доброго времени суток. Стоит такая задача: необходимо из внешнего приложения (например, гипертерминал) копировать текст в свою...

Получение графического текста (данных) из окна стороннего приложения
Задача в том, чтобы получать данные из стороннего приложения и взаимодействовать с ним. Для начала инжект в приложение, затем хук функций...

Не изменяется текст метки в главной форме из другого класса
Цель - изменить на главной форме значение текста в текстовой метке, находясь в другом классе. Сделал так, в коде основной формы...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru