Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Дочернее окно в другом приложении, WinAPI 
:(
    Опции темы
Qwe2
Дата 19.4.2012, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



Есть приложение, к нему можно подключать сторонние dll. Я создал такую dll и в ней сделал модальное диалоговое окна с помощью DialogBox. Все работает. А можно таким же образом создать немодальное окно: чтобы оно висело (хочу поместить туда некий текст с картинкой), а программа дальше бы работала. Просто DialogBox как ему и положено блокирует работу приложения до закрытия диалога...
PM MAIL   Вверх
GremlinProg
Дата 19.4.2012, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(Qwe2 @  19.4.2012,  14:46 Найти цитируемый пост)
А можно таким же образом создать немодальное окно: чтобы оно висело (хочу поместить туда некий текст с картинкой), а программа дальше бы работала. 

если код DLL вызывается в основном потоке приложения (в общем случае - в GUI потоке), то конечно можно


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Qwe2
Дата 19.4.2012, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



А каким образом? Я делал так (см. ниже), но окно либо все такое же модальное (блокирующее основное приложение), либо, если я указывал стиль WS_CHILD - то поведение его становится все равно не правильным...

Код

#include <windows.h>

HINSTANCE hInstance;

LRESULT CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);

//
BOOL WINAPI DllMain(HINSTANCE hInst, DWORD, LPVOID)
{
    hInstance = hInst;
    return TRUE;
}

//
extern "C" __declspec(dllexport) int FuncMy(HWND hWnd, LPCSTR sMess)
{ 
    HWND hWndD = CreateDialog(hInstance, "TMP", hWnd, (DLGPROC)DlgProc);
    //SetWindowLong(hWndD, GWL_EXSTYLE, GetWindowLong(hWndD, GWL_EXSTYLE) | WS_EX_NOPARENTNOTIFY);

    if(!hWndD)
        return 1;

    ShowWindow(hWndD, SW_SHOW);
    UpdateWindow(hWndD);

    MSG msg;
    while (GetMessage(&msg,NULL,0,0))
    {
        if(!IsDialogMessage(hWndD,&msg))
        {
            TranslateMessage(&msg); 
            DispatchMessage(&msg); 
        }
    }
    return msg.wParam; 
}

//
LRESULT CALLBACK DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_INITDIALOG:
        return TRUE;

    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        }
    break;

    case WM_CLOSE:
        DestroyWindow(hWnd);
    PostQuitMessage(0);
    return TRUE;
    }
    return FALSE;
}

PM MAIL   Вверх
GremlinProg
Дата 19.4.2012, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



а цикл здесь не нужен, он уже есть в exe


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
feodorv
Дата 19.4.2012, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(Qwe2 @  19.4.2012,  14:23 Найти цитируемый пост)
 HWND hWndD = CreateDialog(hInstance, "TMP", hWnd, (DLGPROC)DlgProc);

Ну так если указывать владельца диалога (hWnd), то блокировка будет.
Если не указывать (NULL), то не будет:
Код

HWND hWndD = CreateDialog(hInstance, "TMP", NULL, (DLGPROC)DlgProc);

Ну, правда при этом придётся в цикле сообщений делать проверку на IsWindow(hWndD) && IsDialogMessage( hWndD, &msg) и на IsWindow(hWnd) && IsDialogMessage( hWnd, &msg)...

Это сообщение отредактировал(а) feodorv - 19.4.2012, 14:03


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Qwe2
Дата 19.4.2012, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



Цикл сообщений нужен или нет? Стиль WS_CHILD?

Это сообщение отредактировал(а) Qwe2 - 19.4.2012, 14:24
PM MAIL   Вверх
GremlinProg
Дата 19.4.2012, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(feodorv @  19.4.2012,  16:01 Найти цитируемый пост)
Ну так если указывать владельца диалога (hWnd), то блокировка будет.Если не указывать (NULL), то не будет

CreateDialog просто создает окно диалога, без каких-либо блокировок

Добавлено через 4 минуты и 31 секунду
Цитата(Qwe2 @  19.4.2012,  16:12 Найти цитируемый пост)
Цикл сообщений нужен или нет? Стиль WS_CHILD?

нет


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Qwe2
Дата 19.4.2012, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



Когда я убрал цикл сообщений в dll, то окно появилось как немодальное (можно тыкать в меню и т.д.) и все вроде бы ок, но при щелчке на заголовок (даже при наведении на заголовок) или при клике на кнопку exe вылетает с ошибкой...
PM MAIL   Вверх
GremlinProg
Дата 19.4.2012, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(Qwe2 @ 19.4.2012,  16:25)
Когда я убрал цикл сообщений в dll, то окно появилось как немодальное (можно тыкать в меню и т.д.) и все вроде бы ок, но при щелчке на заголовок (даже при наведении на заголовок) или при клике на кнопку exe вылетает с ошибкой...

по всей видимости, в exe используется какая-то объектная оболочка, которая извлекает объект по дескриптору окна, и нет проверки на то, что дескриптор может не поддерживать такой объект, вот и вылетает

т.е. надо править exe (поставить такую проверку), либо использовать ту же оболочку в dll, что используется в exe,
иначе внедрить немодальное окно будет невозможно


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Qwe2
Дата 19.4.2012, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



А можно с помощью hook'а решить это (править exe нет возможности)?
PM MAIL   Вверх
GremlinProg
Дата 19.4.2012, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(Qwe2 @ 19.4.2012,  16:48)
А можно с помощью hook'а решить это (править exe нет возможности)?

не думаю, чтио это будет легко,
левый дескриптор может проскакивать во многих событиях, везде придется патчить код

думаю, если софт достаточно новый, проще связаться с разработчиками и попросить их внести коррективы, раз уж они дают возможность подключать библиотеки (вполне возможно, что именно немодальное окно в сторонней dll они просто не тестировали)


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Qwe2
Дата 19.4.2012, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



Спасибо.
А как частный случай задачи - можно вместо окна (с текстом и картинокй) выводить всплывающую подсказку (то есть теперь в dll будет что-то типа
Код

CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL, WS_POPUP | TTS_ALWAYSTIP, <...>

Нашел как подобное можно сделать в общем случае: по событию от мышки когда курсор наводится на кнопку всплывает подсказка. А можно эту подсказу вывести для exe - она бы появилась на несколько секунд и исчезла, а пользователь в это время продолжает работать?
PM MAIL   Вверх
GremlinProg
Дата 19.4.2012, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



попробовать конечно можно: сабклассить основное окно и перехватить нужные события, задействовав, например TrackMouseEvent,

но попробуй, для начала просто подсказку отобразить в произвольном месте окна,
если проблем не будет, можно двигаться дальше


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Qwe2
Дата 19.4.2012, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



Цитата

для начала просто подсказку отобразить в произвольном месте окна

Вот это и нужно в принципе. Пробую, пока подсказки не вижу, хотя и ошибок тоже нет... Может быть из-за того, что после создания подсказки я сразу же выхожу из функции, которая вызывается из dll (FuncMy())?
PM MAIL   Вверх
feodorv
Дата 19.4.2012, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(GremlinProg @  19.4.2012,  15:12 Найти цитируемый пост)
CreateDialog просто создает окно диалога, без каких-либо блокировок

Хорошо.

...

Это сообщение отредактировал(а) feodorv - 19.4.2012, 19:23


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0532 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.