1) Объясните почему уничтожается только верхнее окно? https://wasm.ru/forum/viewtopic.php?id=7343&p=1 -- читал, пример от туда взял. все равно только верхнее окно. запускал на дедике, тоже самое -- значит проблема в коде. Пробывал и EnumChildWindows и EnumWindows и GetTopWindow.... 2) И вообще, что за глюк: Если не ставить Sleep,10 то прога висит в процессах пару сек и дохнет!, хотя в вайле находится! А со слипом бесконечно в цикле работает... Не понимаю как вайл(труе) может закончится... Бесконечный цикл обеспечивал и вайлом и на метках.... Все её *ох.... Код (Text): .386P .MODEL FLAT, STDCALL option casemap:none ;INCLUDELIB c:\masm32\lib\windows.lib INCLUDE c:\masm32\include\windows.inc includelib c:\masm32\lib\shlwapi.lib include c:\masm32\include\shlwapi.inc INCLUDE c:\masm32\include\user32.inc includelib c:\masm32\lib\user32.lib INCLUDE c:\masm32\include\kernel32.inc includelib c:\masm32\lib\kernel32.lib include c:\masm32\include\shell32.inc includelib c:\masm32\lib\shell32.lib include c:\masm32\include\masm32.inc includelib c:\masm32\lib\masm32.lib ;----------------------------------------- ;Сегмент данных. _DATA SEGMENT DWORD PUBLIC USE32 'DATA' tmp1 DWORD ? err DB "ERROR!",0 _DATA ENDS ;Сегмент кода. _TEXT SEGMENT DWORD PUBLIC USE32 'CODE' START: hidep proc hwnd:HWND ;invoke ShowWindow,hwnd,SW_SHOW invoke SendMessage, hwnd, WM_DESTROY, 0, 0 hidep endp .while 1 invoke Sleep,10 invoke GetTopWindow,NULL mov tmp1,eax invoke SendMessage, tmp1, WM_DESTROY, 0, 0 .endw ;.while 1 ;invoke Sleep,10 ;invoke EnumChildWindows, NULL,addr hidep,0 ;.endw _TEXT ENDS END START ЗЫ: мне банально нужно уничтожить/скрыть все окна....
я конечно извиняюсь, но что говорит отладчик? в каком месте не работает? функция возвращает ошибку? какой код ошибки?
ну а ты как хотел - ты попробуй написать что то типа while(1){ CreateThread(..) } та же фигня получится. use("голова"); а насчёт самой проблемы - так и не понял: ты хочешь скрыть все все все видимые окна? и чего не получается?
invoke EnumChildWindows, NULL,addr hidep,0 вызывает hidep только один раз, т.е. уничтожается только таскменеджер и все... Хотя hidep должна вызываться для каждого окна. Что я не так делаю? NULL-параметр, что бы искала от самого рабочего стола и выше...
Вместо того что бы умничать, помогли бы. а то только use("голова"); и можете писать... Нашел причину почему EnumChildWindows калбэк делает не на все окна: На самом деле калбэк она делает на все окна, только в MSDN и литературе не написано, что SW_SHOW и WM_DESTROY принимают почему то не все окна. Как пример попробывал слать SW_MINIMIZE, и сворачиваться стали и те окна которые не исчезали и не уничтожались. Почему не все сообщения принимаются окнами? Как сделать что бы все слушались? Буду благодарен если дадите рабочий пример убивающий/скрывающий все окна.
pikador >Нашел причину почему EnumChildWindows калбэк делает не на все окна Нет, явно не читали справку по EnumWindows / EnumChildWindows... >NULL-параметр, что бы искала от самого рабочего стола и выше... ?? EnumChildWindows(NULL) = EnumWindows. И что это за "hidep proc" без 2-го параметра? И где в ней команда продолжить, т.е. "return TRUE"? Так что - MSDN.
Это все верно но не принципиально. К примеру тоже самое без EnumWindows: Код (Text): .while TRUE invoke GetForegroundWindow mov ebx,eax ;invoke ShowWindow,ebx,SW_HIDE invoke ShowWindow,ebx,SW_MINIMIZE ;invoke SendMessage, ebx, WM_DESTROY, FALSE, 0 invoke Sleep,5000 .endw Тоже самое, не все окна уничтожаются, зато все сворачиваются. Что ей не так?
>Это все верно но не принципиально. Ну, при таком подходе искать "что не так" - безнадежно. Вот у вас - ".while TRUE". Ну, и что же это за "TRUE" ? Что после Sleep-то ?
По проблеме подскажи лучше. Что за "TRUE"? оно и в африке труе.... значение типа булеан. Если не нравится представь вместо "TRUE" единицу.
Вот для уверенности переписал на VB. Рядом запущен таскменеджер и консоль: таскменеджер убивается, а консоль остается жива. тоже самое если шлю SW_MAXIMIZE Код (Text): Private Sub Command1_Click() Dim Ret As Long Ret = EnumWindows(AddressOf EnumAllWindows, ByVal 0&) End Sub Код (Text): Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, lPalam As Long) As Long Public Declare Function ShowWindow _ Lib "user32" ( _ ByVal hwnd As Long, _ ByVal nCmdShow As Long) _ As Long Public Declare Function PostMessage _ Lib "user32" _ Alias "PostMessageA" ( _ ByVal hwnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) _ As Long Public Const WM_CLOSE As Long = &H10 Public Function EnumAllWindows(ByVal hwnd As Long, ByVal lParam As Long) As Long Call ShowWindow(hwnd, 3) 'Call PostMessage(hwnd, WM_CLOSE, 0&, 0&) End Function 2 kero: Да, я ламер в ассме, а ты гуру ассемблера. И чё мля? Я покрайней мере пытаюсь найти решение, а ты только придираешся ко всему кроме сути проблемы.