Скрытие окна

Тема в разделе "WASM.WIN32", создана пользователем freeloader, 2 окт 2004.

  1. freeloader

    freeloader New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2004
    Сообщения:
    23
    Адрес:
    Russia
    Не могу понять, почему вот этот вот код не работает?



    .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>
     
  2. gerard

    gerard New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    40
    Адрес:
    France
    Уважаемый...



    Это нормальная вещь...



    Когда ты используешь 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 ( Жерар )

    -----------------
     
  3. n0p

    n0p 10010000b

    Публикаций:
    0
    Регистрация:
    7 май 2003
    Сообщения:
    256
    Адрес:
    Новосиbeerск
    А я не понял, что ты сделать пытаешься?
    Код (Text):
    1. BOOL ShowWindow(
    2.     HWND hWnd,          // handle of window
    3.     int nCmdShow        // show state of window
    4.    );


    Поэтому причем там счетчик первым параметром, я не очень понимаю..
     
  4. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Пытается простым перебором 10000 хендлов все окна скрыть на удачу :) Не стоит этого делать, в стэк помещается cx - 2 байта, а не ecx - 4 байта. Лучше использовать FindWindow.
     
  5. gerard

    gerard New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    40
    Адрес:
    France
    Теперь Я начинаю понять, что ты сделать хотел...



    SteelRat тебе дал хорошый решение...



    API FindWindow есть лучше...и легкий больше чтобы использовать...



    Желаю хорошых успехов...



    С уважением,

    Gerard ( Жерар )

    -----------------
     
  6. n0p

    n0p 10010000b

    Публикаций:
    0
    Регистрация:
    7 май 2003
    Сообщения:
    256
    Адрес:
    Новосиbeerск
    Я хотел чтобы он сам ответил. Никогда не надо давать ответ на вопрос, если хочешь научить вопрошающего чему-то. Необходимо подвести его к ответу, но так чтобы он сам на вопрос ответил. Это дает стимул к изучению и чувство удовлетворения от своей победы.



    Есть такая наука: Психология. :)
     
  7. freeloader

    freeloader New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2004
    Сообщения:
    23
    Адрес:
    Russia
    Нет естественно это не кусок моей программы, стало просто интерестно будет ли рабоать или нет, как оказалось не будет, конечноже лудше использовать FindWindow, но это только тогда когда известен либо класс окна, либо заголовок, а как быть если и заголовка не знаешь и не знаешь класса, мне говорили что надо исплользовать EnumWindow, вот только не могу сделать на масм...?
     
  8. gerard

    gerard New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    40
    Адрес:
    France
  9. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    n0p

    Согласен - психология. Как-то работал в интернет-кафе. Занимался подобными делишками кроме компа ничего небыло и инет по лимиту :dntknw: Сам копал, искал, итог - напишу подобный софт "с закрытыми глазами" :)
     
  10. freeloader

    freeloader New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2004
    Сообщения:
    23
    Адрес:
    Russia
    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 байта?, и такая структура тоже не работает... :dntknw: не могу понять принципа, почему на 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

    или может, я что то серьезно недопонимаю?
     
  11. gerard

    gerard New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    40
    Адрес:
    France
    Я вижу и пойму твоа прога...



    Это не плохо...и ялик...



    На MASM нормально она дольжна работать...



    Всех мои Окон -- закрыты теперь Я дольжен передавать старт на моём ПК...



    Хорошые успехы для Меня...



    С уважением,

    Gerard ( Жерар )

    -----------------
     
  12. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    freeloader

    Ты не парься, замени cx на ebx, edi или esi :derisive:
     
  13. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    freeloader



    Api - функции изменяют состояние eax, edx, ecx. Т.е. твоя переменная цикла после вызова API совсем не та, что была до вызова. И цикл будет работать до тех пор, пока случайным образом после ShowWindow в eax окажется 10000. Вероятность этого оч. близка к нулю.



    И ещё момент: откуда уверенность, что в диапазоне 0 - 10000 найдётся хотя бы один валидный хэндл окна, чтобы вызов ShowWindow мог успешно завершиться? Скорее всего ни одно из окон в системе не будет иметь hWnd в этом диапазоне. Вот и получается, что ты скрываешь окна, которых нет.
     
  14. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    freeloader



    Есть же так какие-то функции для работы с цепочкой

    окон. Одна дает хендл Десктопа и другая ссылку

    на следующее окно. Единственно там надо

    аккуратно идти по цепочке, т.к. она динамически

    меняется. Я на VB это гонял, могу поискать,

    но потом на FindWindow переключился.
     
  15. freeloader

    freeloader New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2004
    Сообщения:
    23
    Адрес:
    Russia
    Странно..., я почему то думал, что есил АПИ ничего не возвращает - значит в регист ничего не заноситься, а по поводу того что окна не могут быть в диапозоне от 0 до 10000 то это зря, так как я седня провернул тот вбшный код, который находиться чуть выше, который устанавливает заголовки окон, так результат, почти все...



    Всем просто большое, нет просто огромное спасибо, очень приятно знать, что есть те люди которые могут тебе помочь!!!
     
  16. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    freeloader







    Могут, почему нет? Только никто не гарантирует, что они обязательно все там будут. У меня например (если перебирать хэндлы окон) то они обычно где-то с 60000 начинаются. А большей частью это 6-ти и более значное число (опять же на моём компе). И формируются они по принципу, известному только Винде. Так что расчитывать, что хэндлы обязательно будут идти начиная от нуля - не совсем правильно. И чем дольше время от загрузки Винды - тем больше числа.
     
  17. freeloader

    freeloader New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2004
    Сообщения:
    23
    Адрес:
    Russia
    Нееет я не говорил, что окна не могут быть в диапозоне, просто перед "то" забыл запятую постваить...:)
     
  18. n0p

    n0p 10010000b

    Публикаций:
    0
    Регистрация:
    7 май 2003
    Сообщения:
    256
    Адрес:
    Новосиbeerск
    Ндаа.. И когда народ научится грамотно вопросы задавать?



    Я только сейчас понял, что счетчик в качестве первого параметра - это не ошибка а коварный план программиста..



    Ну в виду изменившихся условий задачи сказать можно, что EnumWindows должна помочь. Я ей никогда не пользовался, так что деталей не знаю, но вроде оно.



    Гугл может помочь найти сорцы на использование этой чудесной функции. Насколько я понимаю, ее использование крайне нетривиально.



    Удачи!
     
  19. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    n0p

    Ну в виду изменившихся условий задачи сказать можно, что EnumWindows должна помочь. Я ей никогда не пользовался, так что деталей не знаю, но вроде оно.



    И даже не "вроде", а точно оно - это единственный штатный способ получить все окна верхнего уровня. "Проверено электроникой". А FindWindow для таких вещей не канает (я, честно говоря, вообще не представляю, для чего оно канает в форме, отличной от FindWindow(nil,nil))+GetWindow - два окна с одинаковым классом\заголовком оно найти в принципе не способно.



    n0p

    Гугл может помочь найти сорцы на использование этой чудесной функции. Насколько я понимаю, ее использование крайне нетривиально.



    Да нет, вполне успешно юзается. Даже с закрытыми глазами.
     
  20. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576