Russian Qt Forum

Qt => Общие вопросы => Тема начата: Vovochka от Октябрь 10, 2008, 15:30



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

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

Спасибо


Название: Re: прочитать QWidget кнопку в другом окне?
Отправлено: Tonal от Октябрь 11, 2008, 19:07
Qt самостоятельно отрисовывает большинство элементов, так что таким методом ничего не получится.
Нужно внедрятся - поищи, я на этом форуме уже описывал что и как нужно делать. :)


Название: Re: прочитать QWidget кнопку в другом окне?
Отправлено: Vovochka от Октябрь 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;
         }

Не знаю какой компилятор использовался для сторонней программы


Название: Re: прочитать QWidget кнопку в другом окне?
Отправлено: Tonal от Октябрь 13, 2008, 16:50
Для внедрения нужно использовать тот же самый компилятор которым собиралась программа. И опции компиляции нужны такие же.
Кроме того, нужно, чтобы программа была собрана с Qt динамически а не статически, и чтобы твоя dll-ка линковалась с этими же библиотеками Qt.

Так что С# здесь не подойдёт.
Только С++, на котором собиралась исходная программа.


Название: Re: прочитать QWidget кнопку в другом окне?
Отправлено: Vovochka от Октябрь 13, 2008, 22:13
Спасибо за ответы
В таком случае это невозможно, программа собрана статически :(

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

Вариант с print screen, вырезанием слова и машинным распознаванием его из картинки не очень хочется делать, но неужели это будет единственным способом...


Название: Re: прочитать QWidget кнопку в другом окне?
Отправлено: Tonal от Октябрь 14, 2008, 07:18
Про Lingvo прикольно. Значит есть ещё какой-то способ. :)


Название: Re: прочитать QWidget кнопку в другом окне?
Отправлено: SASA от Октябрь 14, 2008, 15:06
Цитировать
Про Lingvo прикольно. Значит есть ещё какой-то способ.
Граб с экрана + FineReader :)