![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Qwe2 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 23.3.2008 Репутация: нет Всего: нет |
Есть приложение, к нему можно подключать сторонние dll. Я создал такую dll и в ней сделал модальное диалоговое окна с помощью DialogBox. Все работает. А можно таким же образом создать немодальное окно: чтобы оно висело (хочу поместить туда некий текст с картинкой), а программа дальше бы работала. Просто DialogBox как ему и положено блокирует работу приложения до закрытия диалога...
|
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
если код DLL вызывается в основном потоке приложения (в общем случае - в GUI потоке), то конечно можно -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Qwe2 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 23.3.2008 Репутация: нет Всего: нет |
А каким образом? Я делал так (см. ниже), но окно либо все такое же модальное (блокирующее основное приложение), либо, если я указывал стиль WS_CHILD - то поведение его становится все равно не правильным...
|
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
а цикл здесь не нужен, он уже есть в exe
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Ну так если указывать владельца диалога (hWnd), то блокировка будет. Если не указывать (NULL), то не будет:
Ну, правда при этом придётся в цикле сообщений делать проверку на IsWindow(hWndD) && IsDialogMessage( hWndD, &msg) и на IsWindow(hWnd) && IsDialogMessage( hWnd, &msg)... Это сообщение отредактировал(а) feodorv - 19.4.2012, 14:03 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
| Qwe2 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 23.3.2008 Репутация: нет Всего: нет |
Цикл сообщений нужен или нет? Стиль WS_CHILD?
Это сообщение отредактировал(а) Qwe2 - 19.4.2012, 14:24 |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
CreateDialog просто создает окно диалога, без каких-либо блокировок Добавлено через 4 минуты и 31 секунду нет -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Qwe2 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 23.3.2008 Репутация: нет Всего: нет |
Когда я убрал цикл сообщений в dll, то окно появилось как немодальное (можно тыкать в меню и т.д.) и все вроде бы ок, но при щелчке на заголовок (даже при наведении на заголовок) или при клике на кнопку exe вылетает с ошибкой...
|
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
по всей видимости, в exe используется какая-то объектная оболочка, которая извлекает объект по дескриптору окна, и нет проверки на то, что дескриптор может не поддерживать такой объект, вот и вылетает т.е. надо править exe (поставить такую проверку), либо использовать ту же оболочку в dll, что используется в exe, иначе внедрить немодальное окно будет невозможно -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Qwe2 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 23.3.2008 Репутация: нет Всего: нет |
А можно с помощью hook'а решить это (править exe нет возможности)?
|
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
не думаю, чтио это будет легко, левый дескриптор может проскакивать во многих событиях, везде придется патчить код думаю, если софт достаточно новый, проще связаться с разработчиками и попросить их внести коррективы, раз уж они дают возможность подключать библиотеки (вполне возможно, что именно немодальное окно в сторонней dll они просто не тестировали) -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Qwe2 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 23.3.2008 Репутация: нет Всего: нет |
Спасибо.
А как частный случай задачи - можно вместо окна (с текстом и картинокй) выводить всплывающую подсказку (то есть теперь в dll будет что-то типа
Нашел как подобное можно сделать в общем случае: по событию от мышки когда курсор наводится на кнопку всплывает подсказка. А можно эту подсказу вывести для exe - она бы появилась на несколько секунд и исчезла, а пользователь в это время продолжает работать? |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
попробовать конечно можно: сабклассить основное окно и перехватить нужные события, задействовав, например TrackMouseEvent,
но попробуй, для начала просто подсказку отобразить в произвольном месте окна, если проблем не будет, можно двигаться дальше -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Qwe2 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 23.3.2008 Репутация: нет Всего: нет |
Вот это и нужно в принципе. Пробую, пока подсказки не вижу, хотя и ошибок тоже нет... Может быть из-за того, что после создания подсказки я сразу же выхожу из функции, которая вызывается из dll (FuncMy())? |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Хорошо. ... Это сообщение отредактировал(а) feodorv - 19.4.2012, 19:23 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |