#c #windows #winapi #wtl
#c #Windows #winapi #wtl
Вопрос:
У меня есть сложная программа на C (гибрид старой школы Win32 и WTL), которая не отвечает ни на один запрос на тайловое / каскадное окно на панели задач (т. е. Щелкните правой кнопкой мыши на панели задач и выберите «Каскадные окна» или «Показывать окна бок о бок»). Когда я использую spy , я обнаружил, что ни одно из моих окон не получает никакого сообщения window, в то время как другие программы (в данном случае Firefox) получают серию WM_GETMINMAXINFO, WM_SIZE, WM_PAINT …
Мое фреймовое окно оформлено как WS_OVERLAPPEDWINDOW. Я создаю несколько скрытых окон перед созданием окна frame. Я тестировал на нескольких разных ОС, и симптомы те же. Существуют ли какие-либо ограничения или предварительные условия для Windows shell для отправки сообщений в мое фреймовое окно?
Комментарии:
1. Вы удалили какие-либо пункты меню (например, size) из системного меню?
2. Нет, но мы добавляем в него пункты меню.
3. Как бы то ни было, Chrome и Spy также, похоже, защищены от этих запросов на компоновку. Похоже, никто в Chrome тоже не знает, почему: code.google.com/p/chromium/issues/detail?id=900
4. Оказывается, причина, по которой Spy этого не делает, заключается в том, что он повышен — поэтому Explorer не может отправлять ему соответствующие сообщения — любое другое приложение, запущенное от имени администратора, также защищено. Однако это не объясняет случай Chrome.
Ответ №1:
Windows отправляет сообщения в окно, которое представлено кнопкой на панели задач.
В вашем приложении, и я немного предполагаю здесь, это одно из скрытых окон, которое представлено кнопкой на панели задач. Оконный менеджер не отправляет ни одно из этих сообщений в скрытое окно.
Вы можете решить проблему, установив, что главное окно — это то, которое представлено на панели задач. Вы можете прочитать все о том, какие окна отображаются на панели задач, в великолепном разделе MSDN, озаглавленном «Возможности окна«.
Комментарии:
1. Странная часть заключается в том, что я просмотрел все окна (включая скрытое окно) с помощью spy , и ни одно из них не получает никакого сообщения с панели задач. Кстати, как мне определить, какое окно представлено кнопкой на панели задач?
2. Chrome страдает от тех же проблем (неправильно реагирует на tiling), хотя я не уверен на 100%, почему у него проблемы. Текст, отображаемый на кнопке панели задач, является текстом окна, о котором идет речь (который вы задаете с помощью вызова SetWindowText или сообщения WM_TEXT). Если этот текст совпадает с заголовком вашей основной формы, то мое предположение неверно, и я удалю ответ. Если моя догадка верна, то AeroPeek не должен работать для вашего приложения.
3. Да, это мое основное окно фрейма, и текст тот же. В Windows 7 окно предварительного просмотра отображается правильно, клавиши со стрелками Windows работают как ожидалось, не работает только tiling / cascading. Как ни странно, мой notepad.exe также не выполняет tile / cascade на некоторых компьютерах с Windows 7. Я бы хотел, чтобы какой-нибудь гуру в StackOverflow мог ответить на это.
4. Каков ответ на вопрос, заданный Tergiver в комментарии? Можете ли вы запустить свое приложение без скрытых окон?
5. Для вашего главного окна вы передаете что-нибудь в hwndParent при вызове CreateWindowEx?