EnumWindow прячет окна

Тема в разделе "WASM.WIN32", создана пользователем pikador, 6 апр 2009.

  1. pikador

    pikador New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    101
    1) Объясните почему уничтожается только верхнее окно?
    https://wasm.ru/forum/viewtopic.php?id=7343&p=1 -- читал, пример от туда взял. все равно только верхнее окно.
    запускал на дедике, тоже самое -- значит проблема в коде.
    Пробывал и EnumChildWindows и EnumWindows и GetTopWindow....

    2) И вообще, что за глюк:
    Если не ставить Sleep,10 то прога висит в процессах пару сек и дохнет!, хотя в вайле находится!
    А со слипом бесконечно в цикле работает... Не понимаю как вайл(труе) может закончится...
    Бесконечный цикл обеспечивал и вайлом и на метках.... Все её *ох....

    Код (Text):
    1. .386P
    2. .MODEL FLAT, STDCALL
    3. option casemap:none
    4. ;INCLUDELIB c:\masm32\lib\windows.lib
    5. INCLUDE       c:\masm32\include\windows.inc
    6. includelib c:\masm32\lib\shlwapi.lib
    7. include    c:\masm32\include\shlwapi.inc
    8. INCLUDE       c:\masm32\include\user32.inc
    9. includelib c:\masm32\lib\user32.lib
    10. INCLUDE       c:\masm32\include\kernel32.inc
    11. includelib c:\masm32\lib\kernel32.lib
    12. include c:\masm32\include\shell32.inc
    13. includelib c:\masm32\lib\shell32.lib
    14. include c:\masm32\include\masm32.inc
    15. includelib c:\masm32\lib\masm32.lib
    16. ;-----------------------------------------
    17. ;Сегмент данных.
    18. _DATA SEGMENT DWORD PUBLIC USE32 'DATA'
    19.         tmp1     DWORD ?
    20.                 err   DB   "ERROR!",0
    21. _DATA ENDS
    22. ;Сегмент кода.
    23. _TEXT SEGMENT  DWORD  PUBLIC USE32   'CODE'
    24. START:
    25.  
    26. hidep proc hwnd:HWND
    27. ;invoke ShowWindow,hwnd,SW_SHOW
    28. invoke SendMessage, hwnd, WM_DESTROY, 0, 0
    29. hidep endp
    30.  
    31. .while 1
    32. invoke Sleep,10
    33. invoke GetTopWindow,NULL
    34. mov tmp1,eax
    35. invoke SendMessage, tmp1, WM_DESTROY, 0, 0
    36. .endw
    37.  
    38. ;.while 1
    39. ;invoke Sleep,10
    40. ;invoke EnumChildWindows, NULL,addr hidep,0
    41. ;.endw
    42. _TEXT ENDS
    43. END START
    ЗЫ: мне банально нужно уничтожить/скрыть все окна....
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    я конечно извиняюсь, но что говорит отладчик? в каком месте не работает? функция возвращает ошибку? какой код ошибки?
     
  3. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    ну а ты как хотел - ты попробуй написать что то типа
    while(1){ CreateThread(..) }
    та же фигня получится.

    use("голова");

    а насчёт самой проблемы - так и не понял: ты хочешь скрыть все все все видимые окна?
    и чего не получается?
     
  4. pikador

    pikador New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    101
    invoke EnumChildWindows, NULL,addr hidep,0 вызывает hidep только один раз, т.е. уничтожается только таскменеджер и все...
    Хотя hidep должна вызываться для каждого окна.
    Что я не так делаю? NULL-параметр, что бы искала от самого рабочего стола и выше...
     
  5. pikador

    pikador New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    101
    Вместо того что бы умничать, помогли бы. а то только use("голова"); и можете писать...

    Нашел причину почему EnumChildWindows калбэк делает не на все окна:
    На самом деле калбэк она делает на все окна, только в MSDN и литературе не написано, что
    SW_SHOW и WM_DESTROY принимают почему то не все окна. Как пример попробывал слать SW_MINIMIZE,
    и сворачиваться стали и те окна которые не исчезали и не уничтожались.

    Почему не все сообщения принимаются окнами? Как сделать что бы все слушались?
    Буду благодарен если дадите рабочий пример убивающий/скрывающий все окна.
     
  6. kero

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

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    pikador
    >Нашел причину почему EnumChildWindows калбэк делает не на все окна

    Нет, явно не читали справку по EnumWindows / EnumChildWindows...

    >NULL-параметр, что бы искала от самого рабочего стола и выше...

    ??
    EnumChildWindows(NULL) = EnumWindows.
    И что это за "hidep proc" без 2-го параметра?
    И где в ней команда продолжить, т.е. "return TRUE"?

    Так что - MSDN.
     
  7. pikador

    pikador New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    101
    Это все верно но не принципиально.

    К примеру тоже самое без EnumWindows:
    Код (Text):
    1.     .while TRUE
    2.     invoke GetForegroundWindow
    3.     mov ebx,eax
    4.     ;invoke ShowWindow,ebx,SW_HIDE
    5.     invoke ShowWindow,ebx,SW_MINIMIZE
    6.     ;invoke SendMessage, ebx, WM_DESTROY, FALSE, 0
    7.     invoke Sleep,5000
    8.     .endw
    Тоже самое, не все окна уничтожаются, зато все сворачиваются.
    Что ей не так?
     
  8. kero

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

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

    Ну, при таком подходе искать "что не так" - безнадежно.

    Вот у вас - ".while TRUE".
    Ну, и что же это за "TRUE" ? Что после Sleep-то ?
     
  9. pikador

    pikador New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    101
    По проблеме подскажи лучше.
    Что за "TRUE"? оно и в африке труе.... значение типа булеан. Если не нравится представь вместо "TRUE" единицу.
     
  10. kero

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

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

    pikador New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    101
    Вот для уверенности переписал на VB.
    Рядом запущен таскменеджер и консоль:
    таскменеджер убивается, а консоль остается жива.
    тоже самое если шлю SW_MAXIMIZE

    Код (Text):
    1. Private Sub Command1_Click()
    2. Dim Ret As Long
    3. Ret = EnumWindows(AddressOf EnumAllWindows, ByVal 0&)
    4. End Sub
    Код (Text):
    1. Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, lPalam As Long) As Long
    2. Public Declare Function ShowWindow _
    3.     Lib "user32" ( _
    4.         ByVal hwnd As Long, _
    5.         ByVal nCmdShow As Long) _
    6.         As Long
    7.         Public Declare Function PostMessage _
    8.     Lib "user32" _
    9.     Alias "PostMessageA" ( _
    10.         ByVal hwnd As Long, _
    11.         ByVal wMsg As Long, _
    12.         ByVal wParam As Long, _
    13.         ByVal lParam As Long) _
    14.         As Long
    15.         Public Const WM_CLOSE       As Long = &H10
    16.  
    17. Public Function EnumAllWindows(ByVal hwnd As Long, ByVal lParam As Long) As Long
    18. Call ShowWindow(hwnd, 3)
    19. 'Call PostMessage(hwnd, WM_CLOSE, 0&, 0&)
    20. End Function
    2 kero:
    Да, я ламер в ассме, а ты гуру ассемблера. И чё мля?
    Я покрайней мере пытаюсь найти решение, а ты только придираешся ко всему кроме сути проблемы.