Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вопрос по QWidget

278
06 мая 2011 года
Alexander92
1.1K / / 04.08.2008
Кто работал с Qt, ответьте, пожалуйста, - какому классу принадлежит такое окно?
[ATTACH=CONFIG]5113[/ATTACH]
В Spy++ определяется как стандартный QWidget.

P.S. Вообще, конечная цель - программное управление этим окном (окошко не мое).

P.P.S. Заодно - еще вопрос по той же теме. Пишу:
 
Код:
HWND hwnd = FindWindow(......); // здесь возвращается гарантированно правильный дескриптор
QWidget *q = QWidget::find(hwnd);

В итоге q == NULL. Из-за чего это может быть? Повторюсь, Spy++ видит это окно как QWidget.
316
06 мая 2011 года
Alm3n
889 / / 29.05.2009
Цитата: Alexander92

В Spy++ определяется как стандартный QWidget.


в случае QMainWidow тоже напишет класс QWidget. но на картинке QWidget. внутри него - QtableWidget.
[ATTACH=CONFIG]5114[/ATTACH]
подписаны в Caption.

Цитата:

HWND hwnd = FindWindow(......); // здесь возвращается гарантированно правильный дескриптор
QWidget *q = QWidget::find(hwnd);


 
Код:
QWidget * QWidget::find ( WId id )
Qt::HANDLE

Цитата:

Или мне нужно явно писать QTableWidget::find()?


нет.

278
06 мая 2011 года
Alexander92
1.1K / / 04.08.2008
Возможно, я ж не спорю. Я просто не имел дела с Qt, поэтому и спрашиваю. Меня несколько смущает то, что я не могу получить доступ к этому окну через QWidget::find(). Или мне нужно явно писать QTableWidget::find()?

Да, еще момент. То окно, о котором идет речь, - это ж какое-то дочернее окно n-го уровня вложенности. А если взять главное окно формы, все равно через QWidget::find() ничего не находит.
278
07 мая 2011 года
Alexander92
1.1K / / 04.08.2008
Вопрос временно снимается, сообразил кой-чего. Завтра проверю и отпишусь.
277
07 мая 2011 года
arrjj
1.7K / / 26.01.2011
пруф если окошко не твоё, то QWidget::find всегда будет возвращать 0. QWidget::find работает только для текущего процесса.
278
07 мая 2011 года
Alexander92
1.1K / / 04.08.2008
Да, вот как раз это я и имел в виду. Хочу попробовать внедриться в процесс.
278
08 мая 2011 года
Alexander92
1.1K / / 04.08.2008
Ситуация весьма веселая получается. Благополучно внедрился в процесс, но QWidget::find() упорно возвращает ноль (внедрение 100% проходит правильно, GetCurrentProcessId() возвращает правильный PID). Отмечу, что я теста ради написал собственное Qt-приложение, и для него QWidget* спокойно определяется. Есть у кого-нибудь соображения, почему такое может происходить? Существует ли в принципе какая-то защита, которая может блокировать эти вызовы? Или, может быть, там на самом деле не QWidget, а просто ребята подменили имя класса? Вот что видит Spy++:

[ATTACH=CONFIG]5117[/ATTACH]


Цитата: Alm3n

 
Код:
QWidget * QWidget::find ( WId id )
Qt::HANDLE


Немного не понял, что вы имеете в виду?

316
08 мая 2011 года
Alm3n
889 / / 29.05.2009
Цитата: Alexander92
Немного не понял, что вы имеете в виду?


было предположение, что не определяется из-за несоотвествия типов. был hwnd, а по документации нужен Qt::HANDLE. хотя потом, подумав, понял, насколько идиотским было это предположение.в общем пока идей никаких.

278
08 мая 2011 года
Alexander92
1.1K / / 04.08.2008
Я понял. Хорошо, тогда такой вопрос: вы не встречали специализированных программ, позволяющих разбирать оконную структуру Qt-приложений?
14
09 мая 2011 года
Phodopus
3.3K / / 19.06.2008
Вы можете точно определить, куда именно идет ваш вызов QWidget::find() после внедрения, и куда пойдет такой вызов у того самого приложения? Суть в том, что недостаточно получить контекст процесса, нужно еще получить и контекст Qt, доступ к ее QWidgetPrivate::mapper например.
278
09 мая 2011 года
Alexander92
1.1K / / 04.08.2008
Phodopus, я понял вашу мысль. Посмотрю обязательно, спасибо.
278
09 мая 2011 года
Alexander92
1.1K / / 04.08.2008
Всем спасибо еще раз, тему можно закрывать. Дело действительно было в том, что подгружалась "внутренняя" библиотека, и функцию find() нужно было брать именно оттуда.

Разобрался окончательно. Ситуация следующая: если проанализировать таблицу экспорта "родной" DLL, котороая подгружается по умолчанию, можно увидеть, что там используется не класс QWidget, а нечто, похожее на него (не производный от него класс, т.к. многих функций из QWidget'а там нет). Поэтому я благополучно решил проблему через GetProcAddress() и вызов всех необходимых функций-членов через ассемблерные вставки.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог