Дескриптор главного окна из HINSTANCE

Тема в разделе "WASM.BEGINNERS", создана пользователем commissar, 23 апр 2006.

  1. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    2 Quantum



    Вот, сходу прокопипастил ответ TermoSINteZ-у, а Вы, оказывается, уже все сказали :)



    > И ещё. Зачем WS_EX_TOPMOST? Окна, которые "owned" в любом случае отображаются поверх родительского окна



    Инициатива с WS_EX_TOPMOST - моя, см.выше, но смысл - как раз в сочетании с hWndParent=0 и с "addr EditClass" вместо "NULL" в заголовке.

    Тогда Process Explorer (тоже см.выше) ловит как "главное" этот эдит, что забавно и поучительно.
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    Да над собой смеюсь .. над кем ещеж.

    А цифра 8 , да пардон не заметил, ошибся

    Ну а так все понятно. Спасибо за разяснения



    > "addr EditClass" вместо "NULL"

    Ваш пример и без этого работает (я имею ввиду заголовке). Только в этом случае, едит будет не поверх, а за главным окном по умолчанию.
     
  3. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Для полноты картины - еще кое-что.



    SDragon:

    > Делаешь EnumWindows, а в callback-процедуре (EnumWindowsProc) вызываешь GetWindowThreadProcessId и сравниваешь с заданным идентификатором процесса.

    > Если совпало, значит, ты нашел то самое главное окно.



    Кстати, так и устроен CMainWindowIterator by Paul DiLascia (http://msdn.microsoft.com/msdnmag/issues/02/07/CQA/).



    Но вот простейший контрпример. Суть - SetParent(hwnd_MainWindow, hwnd_Progman).



    Т.е. EnumWindows здесь не годится еще и потому, что "самое главное окно" может и не быть top-level !

    Т.е. правильнее - EnumChildWindows после GetDesktopWindow.
     
  4. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    По вновь открывшимся обстоятельствам :) - вынужден добавить и еще кое-что о EnumChildWindows, а точнее - комментарий к вышеприведенной цитате из MSDN:

    > MSDN -> Windows -> Window Features -> Message-Only Windows :
    > "A message-only window enables you to send and receive messages.
    > It is not visible, has no z-order, cannot be enumerated, and does not receive broadcast messages. The window simply dispatches messages.
    > To create a message-only window, specify the HWND_MESSAGE constant or a handle to an existing message-only window in the hWndParent parameter of the CreateWindowEx function.
    > You can also change an existing window to a message-only window by specifying HWND_MESSAGE in the hWndNewParent parameter of the SetParent function.
    > To find message-only windows, specify HWND_MESSAGE in the hwndParent parameter of the FindWindowEx function.
    > In addition, FindWindowEx searches message-only windows as well as top-level windows if both the hwndParent and hwndChildAfter parameters are NULL."

    1) "cannot be enumerated"

    Да могут !
    "Обычные" окна образуют иерархию с вершиной DesktopWindow, а EnumChildWindows(DesktopWindow) перечисляет все "обычные" окна.
    Но и message-only окна образуют иерархию, вот процедурка для получения вершинного "MessageWindow" (назовем его так):

    GetMessageWindow = GetAncestor(FindWindowEx(HWND_MESSAGE,0,0,0),GA_PARENT)

    О классе полученного окна — "Message" — в MSDN аж целая строчка:

    > Message Windows 2000/Windows XP: The class for a message-only window.

    Это строчка из таблицы, которая "describes the system classes that are available only for use by the system" (MSDN -> About Window Classes -> System Classes).
    Таблица, кстати, неполная...

    Так вот, оказывается — EnumChildWindows(MessageWindow) enumerates all message-only windows !

    См. исходники утилиток WinTreeSnap, FrameRector.

    2) "To create a message-only window, specify the HWND_MESSAGE constant or a handle to an existing message-only window in the hWndParent parameter of the CreateWindowEx function.

    Но это верно только для вершинного MessageWindow !
    А любой другой message-only owner приведет к созданию "обычного", а не message-only окна.

    3) "You can also change an existing window to a message-only window by specifying HWND_MESSAGE in the hWndNewParent parameter of the SetParent function."

    А вот тут не только HWND_MESSAGE или MessageWindow, но и любое message-only сгодится.

    Т.е. MSDN-овские разъяснения о hWndParent и hWndNewParent надо бы поменять местами :)

    (по http://rsdn.ru/Forum/Message.aspx?mid=2079498&all=1 - "False info from MSDN (about message-only windows)")

    ------

    UPDATED:

    WinTreeSnap v.2007-05-20

    FrameRector v.2008-08-31

    ------
     
  5. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    kero
    Долго думал, откуда ощущение дежа-вю. Ты же на рсдн это постил недавно :)
     
  7. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    IceStudent

    > Долго думал, откуда ощущение дежа-вю. Ты же на рсдн это постил недавно :)

    Долго думал - потому, что коротко читал :) Последняя строчка, та, что в скобках :)

    Или это упрек, что одно и то же написал и там, и тут ?
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    kero
    Если точнее - "долго думал, пока читал". Нет, не упрёк - просто замечание. off-topic, то бишь.