HWND hwnd = FindWindow(......); // здесь возвращается гарантированно правильный дескриптор
QWidget *q = QWidget::find(hwnd);
Вопрос по QWidget
[ATTACH=CONFIG]5113[/ATTACH]
В Spy++ определяется как стандартный QWidget.
P.S. Вообще, конечная цель - программное управление этим окном (окошко не мое).
P.P.S. Заодно - еще вопрос по той же теме. Пишу:
Код:
В итоге q == NULL. Из-за чего это может быть? Повторюсь, Spy++ видит это окно как QWidget.
Цитата: 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
Qt::HANDLE
Цитата:
Или мне нужно явно писать QTableWidget::find()?
нет.
Да, еще момент. То окно, о котором идет речь, - это ж какое-то дочернее окно n-го уровня вложенности. А если взять главное окно формы, все равно через QWidget::find() ничего не находит.
Вопрос временно снимается, сообразил кой-чего. Завтра проверю и отпишусь.
пруф если окошко не твоё, то QWidget::find всегда будет возвращать 0. QWidget::find работает только для текущего процесса.
Да, вот как раз это я и имел в виду. Хочу попробовать внедриться в процесс.
[ATTACH=CONFIG]5117[/ATTACH]
Цитата: Alm3n
Код:
QWidget * QWidget::find ( WId id )
Qt::HANDLE
Qt::HANDLE
Немного не понял, что вы имеете в виду?
Цитата: Alexander92
Немного не понял, что вы имеете в виду?
было предположение, что не определяется из-за несоотвествия типов. был hwnd, а по документации нужен Qt::HANDLE. хотя потом, подумав, понял, насколько идиотским было это предположение.в общем пока идей никаких.
Я понял. Хорошо, тогда такой вопрос: вы не встречали специализированных программ, позволяющих разбирать оконную структуру Qt-приложений?
Вы можете точно определить, куда именно идет ваш вызов QWidget::find() после внедрения, и куда пойдет такой вызов у того самого приложения? Суть в том, что недостаточно получить контекст процесса, нужно еще получить и контекст Qt, доступ к ее QWidgetPrivate::mapper например.
Phodopus, я понял вашу мысль. Посмотрю обязательно, спасибо.
Разобрался окончательно. Ситуация следующая: если проанализировать таблицу экспорта "родной" DLL, котороая подгружается по умолчанию, можно увидеть, что там используется не класс QWidget, а нечто, похожее на него (не производный от него класс, т.к. многих функций из QWidget'а там нет). Поэтому я благополучно решил проблему через GetProcAddress() и вызов всех необходимых функций-членов через ассемблерные вставки.