Управление форвардом из Си++

Здесь обсуждаются любые продукты компании СофтЛаб-НСК для телевизионного вещания (Форвард Т, Форвард ТС, Форвард Голкипер, Форвард Рефери, Форвард Офис, Форвард Инжест)

Модераторы: ElenVR, Людмила, PR

Ответить
Игорь Таранцев
Сообщения: 493
Зарегистрирован: 04 янв 2004 12:45
Откуда: СофтЛаб-НСК

Сообщение Игорь Таранцев »

Насколько я помню, никаких специальных действий действий, ограничивающих посылку сообщений невидимому окну, мы не делали. У меня есть вопрос - действительно ли как только Вы говорите окну ShowWindow(SW_HIDE) оно перестает получать сообщения, и, соответственно, как только говорите ShowWindow(SW_SHOW), то сообщения начинают приходить? Или Вы делаете окно невидиым как-то по другому?
int
Сообщения: 21
Зарегистрирован: 03 июн 2013 14:12

Сообщение int »

Насколько я помню, никаких специальных действий действий, ограничивающих посылку сообщений невидимому окну, мы не делали. У меня есть вопрос - действительно ли как только Вы говорите окну ShowWindow(SW_HIDE) оно перестает получать сообщения, и, соответственно, как только говорите ShowWindow(SW_SHOW), то сообщения начинают приходить? Или Вы делаете окно невидимым как-то по другому?
Пробовал и так, а еще пробовал делать окно наследуемое от HWND_MESSAGE, в него вообще сообщения не приходят - 3 сообщения на старте и все, я уже показывал этот код, приведу его еще раз:

Код: Выделить всё

    // create window
    static const wchar_t* class_name = L"VE_FORWARD_HOOK";
    WNDCLASSEX wx = {};
    wx.cbSize = sizeof(WNDCLASSEX);
    wx.lpfnWndProc = WindowProc;
    wx.hInstance = 0;
    wx.lpszClassName = class_name;
    if (RegisterClassEx(&wx)) {
        // регистрируем невидимое окно только для приема сообщений
        hWindow = CreateWindowEx(0, class_name, L"forward_hook_wnd", 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL);
    }
Перехватите в своей программе все сообщения, ответственные за закрытие окна - WM_CLOSE, например, и в обработке этого сообщения ничего не делайте. Или по этому сообщению делайте minimize окна программы. Также, если это диалоговое приложение, перехватите OnOK и OnCancel и тоже в них ничего не делайте, иначе программу можно будет закрыть случайным нажатием Enter или Esc.

Программу тогда возможно будет закрыть только убиванием ее в списке процессов. То есть, случайно закрыть ее не получится, и даже специально - придется сильно постараться.
Да, именно так и планирую. А за закрытие окна из диспетчера задач у нас санкции жестче - с таким сотрудником мы прощаемся. Тем более, что весь процесс телевещания автоматизирован практически полностью. У режиссеров задача только следить за качеством и принятие решения в экстренных ситуаций.

Добавлено:
Вот что выяснил. Если в принципе закомментировать ShowWindow() при инициализации окна - сообщения не приходят. Но сделал вот так:

Код: Выделить всё

	case WM_CLOSE:
		ShowWindow(hWnd, SW_HIDE);
		break;
Окно исчезает из вида, точка останова на "Shedule.Start" срабатывает! Т.е. окно принимает сообщения. А по поводу HWND_MESSAGE я не буду уже исследовать. Задача вполне решена.
vd
Сообщения: 2311
Зарегистрирован: 05 мар 2003 19:21

Сообщение vd »

Пробовал и так, а еще пробовал делать окно наследуемое от HWND_MESSAGE, в него вообще сообщения не приходят - 3 сообщения на старте и все, я уже показывал этот код, приведу его еще раз:
У нас при разработке программ никто давно не пользуется "чистым" Windows API. А при написании программ на MFC лично я не испытывал проблем с получением сообщений через SLMessageServer. Также, насколько я знаю, нет таких проблем и в программах на .Net и C#. Поэтому вряд ли кто из нас сможет объяснить, почему в Вашем примере сообщения в программу не приходили. Это требует отдельного исследования, смысла в котором я не вижу, т.к. - см. ниже.
Окно исчезает из вида, точка останова на "Shedule.Start" срабатывает! Т.е. окно принимает сообщения. А по поводу HWND_MESSAGE я не буду уже исследовать. Задача вполне решена.
Я считаю, это главное.
Ответить