Russian Qt Forum
Ноябрь 24, 2024, 14:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: прочитать QWidget кнопку в другом окне?  (Прочитано 5656 раз)
Vovochka
Гость
« : Октябрь 10, 2008, 15:30 »

Есть Сторонняя программа.
Необходимо считать текст с кнопки.
Моя программа на С#, подключаю функции из user32.dll. Нахожу родительское окно, перебираю в нем объекты через EnumChildWindows
Таким образом находится hWnd объекта, который содержит картинку и надпись.
GetClassName возвращает QWidget,
GetWindowText возвращает unnamed

Каким образом можно дальше углубиться по иерархии и разобрать этот QWidget?
EnumChildWindows не находит у него потомков.

Спасибо
Записан
Tonal
Гость
« Ответ #1 : Октябрь 11, 2008, 19:07 »

Qt самостоятельно отрисовывает большинство элементов, так что таким методом ничего не получится.
Нужно внедрятся - поищи, я на этом форуме уже описывал что и как нужно делать. Улыбающийся
Записан
Vovochka
Гость
« Ответ #2 : Октябрь 13, 2008, 15:57 »

Qt самостоятельно отрисовывает большинство элементов, так что таким методом ничего не получится.
Нужно внедрятся - поищи, я на этом форуме уже описывал что и как нужно делать. Улыбающийся
Спасибо за помощь

Пробую внедриться. Но ничего не происходит.
Подскажите, пожалуйста, мои ошибки.
Код:
            Debug.Print("Entering the matrix");
            HookWindowMessage(p.MainWindowHandle, SCWinProc);

        ....
        ....

        public delegate IntPtr WndProcDelegate(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

        [DllImport("user32.dll", EntryPoint = "SetWindowLong")]
        private static extern int SetWindowLong32(IntPtr hWnd, int nIndex, [MarshalAs(UnmanagedType.FunctionPtr)] WndProcDelegate windowCallback);

        [DllImport("user32.dll", EntryPoint = "SetWindowLongPtr")]
        private static extern IntPtr SetWindowLongPtr64(IntPtr hWnd, int nIndex, [MarshalAs(UnmanagedType.FunctionPtr)] WndProcDelegate windowCallback);
       
        public static IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, WndProcDelegate windowCallback)
        {
            if (IntPtr.Size == 8)
                return SetWindowLongPtr64(hWnd, nIndex, windowCallback);
            else
                return new IntPtr(SetWindowLong32(hWnd, nIndex, windowCallback));
        }

        private const int GWL_WNDPROC = -4;
        public static IntPtr HookWindowMessage(IntPtr window, WndProcDelegate callback)
        {
            return SetWindowLongPtr(window, GWL_WNDPROC, callback);
        }

        public static IntPtr SCWinProc(IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam)
        {
             Debug.Print("SCWinProc Called");
             return (IntPtr)0;
         }

Не знаю какой компилятор использовался для сторонней программы
Записан
Tonal
Гость
« Ответ #3 : Октябрь 13, 2008, 16:50 »

Для внедрения нужно использовать тот же самый компилятор которым собиралась программа. И опции компиляции нужны такие же.
Кроме того, нужно, чтобы программа была собрана с Qt динамически а не статически, и чтобы твоя dll-ка линковалась с этими же библиотеками Qt.

Так что С# здесь не подойдёт.
Только С++, на котором собиралась исходная программа.
Записан
Vovochka
Гость
« Ответ #4 : Октябрь 13, 2008, 22:13 »

Спасибо за ответы
В таком случае это невозможно, программа собрана статически Грустный

В ABBYY Lingvo 12 есть такая опция: при зажатом CTRL и наведении курсора на любое слово, в любом окне, появляется всплывающая подсазка с переводом этого слова. Эта опция срабатывает и для этой нужной мне кнопки.
Подскажите пожалуйста, в какую сторону смотреть чтобы реализовать подобный способ прочтения текста. Я знаю координаты на экране этого слова, которое мне надо прочитать.

Вариант с print screen, вырезанием слова и машинным распознаванием его из картинки не очень хочется делать, но неужели это будет единственным способом...
Записан
Tonal
Гость
« Ответ #5 : Октябрь 14, 2008, 07:18 »

Про Lingvo прикольно. Значит есть ещё какой-то способ. Улыбающийся
Записан
SASA
Гость
« Ответ #6 : Октябрь 14, 2008, 15:06 »

Цитировать
Про Lingvo прикольно. Значит есть ещё какой-то способ.
Граб с экрана + FineReader Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.108 секунд. Запросов: 21.