Не могу понять, почему вот этот вот код не работает? .386 .model flat,stdcall option casemap:none include windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib .data lpText db "Text",0 lpCaption db "Caption",0 .code Main PROC mov cx, 10000 ;jcxz prcEND Cykl: invoke ShowWindow,cx,SW_HIDE loop Cykl ;prcEND: invoke MessageBox,NULL, addr lpText, addr lpCaption, MB_OK invoke ExitProcess,0 Main ENDP end Main <ul type=disc></ul>
Уважаемый... Это нормальная вещь... Когда ты используешь ShowWindow используют handle Window и можно иметь один... Ты дольжен (на) создавать окно чтобы иметь его "Эндел"... invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\ WS_CAPTION or WS_SYSMENU ,Wtx,Wty,Wwd,Wht,NULL,NULL,\ hInst,NULL mov hwnd,eax invoke ShowWindow,hwnd,SW_HIDE Я увидел,что Ты используешь только register cx take ecx Другая вещь:всё время попробуйте использовать hWnd для MessageBox и не NULL Думаю, что Ты смогли бы продолжить... Желаю хорошых успехов... С уважением, Gerard ( Жерар ) -----------------
А я не понял, что ты сделать пытаешься? Код (Text): BOOL ShowWindow( HWND hWnd, // handle of window int nCmdShow // show state of window ); Поэтому причем там счетчик первым параметром, я не очень понимаю..
Пытается простым перебором 10000 хендлов все окна скрыть на удачу Не стоит этого делать, в стэк помещается cx - 2 байта, а не ecx - 4 байта. Лучше использовать FindWindow.
Теперь Я начинаю понять, что ты сделать хотел... SteelRat тебе дал хорошый решение... API FindWindow есть лучше...и легкий больше чтобы использовать... Желаю хорошых успехов... С уважением, Gerard ( Жерар ) -----------------
Я хотел чтобы он сам ответил. Никогда не надо давать ответ на вопрос, если хочешь научить вопрошающего чему-то. Необходимо подвести его к ответу, но так чтобы он сам на вопрос ответил. Это дает стимул к изучению и чувство удовлетворения от своей победы. Есть такая наука: Психология.
Нет естественно это не кусок моей программы, стало просто интерестно будет ли рабоать или нет, как оказалось не будет, конечноже лудше использовать FindWindow, но это только тогда когда известен либо класс окна, либо заголовок, а как быть если и заголовка не знаешь и не знаешь класса, мне говорили что надо исплользовать EnumWindow, вот только не могу сделать на масм...?
freeloader попробуй поити загрузить этот Файл для API...( на VisualBasic)... http://users.chello.be/cr27630/3.7/agsetup.exe http://www.allapi.net/vbtutor/tutmain.shtml на программу agsetup.exe ты наиду много примеров для API... Желаю хорошых успехов... С уважением, Gerard ( Жерар ) -----------------
n0p Согласен - психология. Как-то работал в интернет-кафе. Занимался подобными делишками кроме компа ничего небыло и инет по лимиту Сам копал, искал, итог - напишу подобный софт "с закрытыми глазами"
Api Guide у меня есть..., что же касается VB, то написал все работает, только код не со скрытием, а просто поменять текст: Private Sub Command1_Click() Dim i As Integer For i = 0 To 10000 Call SetWindowText(i, "EXAMPLE") Next i End Sub Что же касается, асма, то понятно что cx 2 байта, значить ecx 4 байта?, и такая структура тоже не работает... не могу понять принципа, почему на VB все хорошо, а на masm все плохо? mov eax,0 .repeat add eax,1 ;invoke ShowWindow,eax,SW_HIDE invoke SetWindowText,eax, addr lpString .until eax==10000 invoke ExitProcess,0 или может, я что то серьезно недопонимаю?
Я вижу и пойму твоа прога... Это не плохо...и ялик... На MASM нормально она дольжна работать... Всех мои Окон -- закрыты теперь Я дольжен передавать старт на моём ПК... Хорошые успехы для Меня... С уважением, Gerard ( Жерар ) -----------------
freeloader Api - функции изменяют состояние eax, edx, ecx. Т.е. твоя переменная цикла после вызова API совсем не та, что была до вызова. И цикл будет работать до тех пор, пока случайным образом после ShowWindow в eax окажется 10000. Вероятность этого оч. близка к нулю. И ещё момент: откуда уверенность, что в диапазоне 0 - 10000 найдётся хотя бы один валидный хэндл окна, чтобы вызов ShowWindow мог успешно завершиться? Скорее всего ни одно из окон в системе не будет иметь hWnd в этом диапазоне. Вот и получается, что ты скрываешь окна, которых нет.
freeloader Есть же так какие-то функции для работы с цепочкой окон. Одна дает хендл Десктопа и другая ссылку на следующее окно. Единственно там надо аккуратно идти по цепочке, т.к. она динамически меняется. Я на VB это гонял, могу поискать, но потом на FindWindow переключился.
Странно..., я почему то думал, что есил АПИ ничего не возвращает - значит в регист ничего не заноситься, а по поводу того что окна не могут быть в диапозоне от 0 до 10000 то это зря, так как я седня провернул тот вбшный код, который находиться чуть выше, который устанавливает заголовки окон, так результат, почти все... Всем просто большое, нет просто огромное спасибо, очень приятно знать, что есть те люди которые могут тебе помочь!!!
freeloader Могут, почему нет? Только никто не гарантирует, что они обязательно все там будут. У меня например (если перебирать хэндлы окон) то они обычно где-то с 60000 начинаются. А большей частью это 6-ти и более значное число (опять же на моём компе). И формируются они по принципу, известному только Винде. Так что расчитывать, что хэндлы обязательно будут идти начиная от нуля - не совсем правильно. И чем дольше время от загрузки Винды - тем больше числа.
Ндаа.. И когда народ научится грамотно вопросы задавать? Я только сейчас понял, что счетчик в качестве первого параметра - это не ошибка а коварный план программиста.. Ну в виду изменившихся условий задачи сказать можно, что EnumWindows должна помочь. Я ей никогда не пользовался, так что деталей не знаю, но вроде оно. Гугл может помочь найти сорцы на использование этой чудесной функции. Насколько я понимаю, ее использование крайне нетривиально. Удачи!
n0p Ну в виду изменившихся условий задачи сказать можно, что EnumWindows должна помочь. Я ей никогда не пользовался, так что деталей не знаю, но вроде оно. И даже не "вроде", а точно оно - это единственный штатный способ получить все окна верхнего уровня. "Проверено электроникой". А FindWindow для таких вещей не канает (я, честно говоря, вообще не представляю, для чего оно канает в форме, отличной от FindWindow(nil,nil))+GetWindow - два окна с одинаковым классом\заголовком оно найти в принципе не способно. n0p Гугл может помочь найти сорцы на использование этой чудесной функции. Насколько я понимаю, ее использование крайне нетривиально. Да нет, вполне успешно юзается. Даже с закрытыми глазами.