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

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

  1. commissar

    commissar New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2006
    Сообщения:
    9
    Адрес:
    Moldova
    Можно ли, имея HINSTANCE приложения, получить дескриптор (HWND) его главного окна?
     
  2. SDragon

    SDragon New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2005
    Сообщения:
    133
    Адрес:
    Siberia
    Делаешь EnumWindows, а в callback-процедуре (EnumWindowsProc) вызываешь GetWindowThreadProcessId и сравниваешь с заданным идентификатором процесса. Если совпало, значит, ты нашел то самое главное окно.
     
  3. commissar

    commissar New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2006
    Сообщения:
    9
    Адрес:
    Moldova
    Понятно, спасибо.
     
  4. kero

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

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



    (И кстати о "совпало": а если приложение выдает более одного top-level окна ?)
     
  5. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    Ну и что ? Ты можешь сравнить с ид и проверить на свойство "родитель" и всегда получишь самое главное окно.
     
  6. kero

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

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    > Ну и что ? Ты можешь сравнить с ид и проверить на свойство "родитель" и всегда получишь самое главное окно.



    Да ну ? А ты не забыл ли, что имеешь дело с top-level окнами (EnumWindows ведь) ?

    "Родителем" даже "неглавного" такого окна может быть и десктоп, и попробуй получи тогда "самое главное".



    Между прочим, с EnumWindows вообще-то заковыка.

    Что, если приложение имеет только одно окно, но зато оно - message-only ?

    Ведь EnumWindows такие окна просто-напросто не перечисляет.
     
  7. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    kero

    А что это за окна такие "message-only"?
     
  8. kero

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

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

    > А что это за окна такие "message-only"?



    Только на Win>=2k



    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."



    Вот эта утилитка, надеюсь, покажет все текущие message-only на Вашем компе:

    http://www.geocities.com/xmemor/2lz/wintreesnap.zip
     
  9. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    А чего его получать то ты же можешь проверить PID процесса окна , следовательно десктопа не получишь.. Я это и имел ввиду
     
  10. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    kero

    Ясно. Спасибо!
     
  11. kero

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

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



    > А чего его получать то ты же можешь проверить PID процесса окна, следовательно десктопа не получишь.. Я это и имел ввиду



    Эка ты себя заморочил...

    Ну, возьми приложение с "главным" окном через CreateWindowEx, добавь по WM_CREATE создание Edit, но только не с WS_CHILD,

    а с WS_OVERLAPPEDWINDOW+WS_VISIBLE (а хочешь - с WS_POPUP etc), с тем же hInstance и с hWndParent=hMenu=0.

    А теперь запусти и отличи - тем способом, что "имел ввиду" - "главное" окно от добавленного.
     
  12. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    Ты видел утилиту Руссиновича ? там для процессов ,перечислялись еще и имена главныйх окон (если они есть). Так вот там процедурка то.. строчек 10-15.

    И он же показывает верно. Титл окна. Там правда пару дополнительных проверок. Но в двоем случае он не возвратил имя Edit а нормально вернул титл главного видимого окна.
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Видимо, "главное" - это просто первое top-level? Из принадлежащих одному процессу, имеется ввиду.
     
  14. kero

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

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



    Итак, ты убедился, что кое-чего не учел, и решил копнуть глубже. И правильно.

    Но что за утилита, почему не называешь ? У Руссиновича их знаешь сколько...

    Короче: если это Process Explorer (v.10.06) - то опять мимо кассы.

    Не годится та процедурка-то, и без кода ясно, просто понаблюдай за ProсExp:

    он берет самое верхнее из top-level окон процесса, только и всего.

    Т.е. если у того Edit-а будет WS_EX_TOPMOST, а у "главного" - не будет, то чей титл вернется ? Проверь.

    Но и это еще не все.

    Если обнулить текст "главного" окна, то даже если "главное" имеет WS_EX_TOPMOST, а Edit не имеет, - вернется титл Edit-а.

    Так что с окнами у ProсExp напряженка.
     
  15. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    Пример в студию где Создается Edit со всеми вышеперечисленными параметрами так как при (WS_OVERLAPPEDWINDOW+WS_VISIBLE и без WM_CHILD) - эдит не будет отображатся.
     
  16. kero

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

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Кажется, зря я деликатничал, "не замечая" бессвязности посланий от TermoSINteZ-а (TermoSINteZ-ов ?).

    Но поскольку TermoSINteZ №4, очевидно, beginner, - солдат ребенка не обидит.



    > Пример в студию где Создается Edit со всеми вышеперечисленными параметрами так как при (WS_OVERLAPPEDWINDOW+WS_VISIBLE и без WM_CHILD) - эдит не будет отображатся



    Берешь Iczelion's Win32 API Tutorial - Урок 3 "Простое окно",

    и добавляешь в WIN.asm в процедуре WndProc перед строчкой ".ELSE" следующее:



    .elseif uMsg==WM_CREATE

    .data

    ClassName2 db "edit",0

    .code

    invoke CreateWindowEx,WS_EX_TOPMOST,addr ClassName2,addr ClassName2,WS_OVERLAPPEDWINDOW or WS_VISIBLE,200,200,200,200,0,0,hInstance,0



    Откомпиль - и будет тебе пример хоть в студию, хоть куда.



    А заодно и с таким монстром ознакомься:



    .data

    ClassName db "edit",0

    .code

    start:

    invoke CreateWindowEx,WS_EX_TOPMOST,addr ClassName,addr ClassName,WS_OVERLAPPEDWINDOW or WS_VISIBLE,200,200,200,200,0,0,0,0

    invoke MessageBox,0,addr ClassName,0,0

    invoke ExitProcess,0

    end start



    Кстати, вместо "edit" можешь подставить любой другой predefined control class, и даже просабклассить тоже можешь.

    И все эти извращения будут "отображатся", категоричный ты наш.
     
  17. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    ха нифига не отображается :
    Код (Text):
    1.  
    2. invoke CreateWindowEx,WS_EX_TOPMOST,addr EditIPClass,NULL,\
    3.         WS_OVERLAPPEDWINDOW or WS_VISIBLE or\
    4.         ES_AUTOHSCROLL,80h,30h,0E0h,16h,hWnd,8,hInstance,0
    5. mov Edit,eax
    6.  




    Нет, я не хочу ругаться и спорить, я предположу, что вы, возможно, умнее меня, но делать выводы о том , что я не читал Iczelion`a , и то что я "бегиннерс"..



    вот пример (см аттач):

    [​IMG] 336799492__testesdi.Asm
     
  18. TermoSINteZ

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

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

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    TermoSINteZ

    > invoke CreateWindowEx,WS_EX_TOPMOST,

    > addr EditClass,NULL,\

    > WS_OVERLAPPEDWINDOW or WS_VISIBLE or\

    > ES_AUTOHSCROLL,80h,30h,0E0h,16h,hWnd,8,hInstance,0

    Вы пытаетесь создать окно, которое принадлежит другому окну, но при этом не является дочерним. В справке такие окна называют "owned window". В поле "hMenu" Вы указываете не хендл меню, а константу 8, но окно ведь не дочернее! Стало быть нужен именно хендл меню или ноль, но не ID. Скорее всего это окно не создастся.



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

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

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



    > ха нифига не отображается



    "Над кем смеетесь? Над собой смеетесь!" Не отображается-то - что ? ТВОЙ пример, которым ты зачем-то подменил мой.

    Для создания данного Edit-а обязательно, чтобы hMenu=0. А у тебя 8 с потолка.



    > но делать выводы о том, что я не читал Iczelion`a, и то что я "бегиннерс"..



    Ты опять-таки невнимательно читал мой пост. Iczelion был привлечен именно как всем здесь известный источник.

    Что касается "бегиннерс" - то речь ведь шла конкретно об уровне поста TermoSINteZ №4, не более того.