проблема EnumChildWindow

Тема в разделе "WASM.ASSEMBLER", создана пользователем mke2fs, 5 июн 2009.

  1. mke2fs

    mke2fs New Member

    Публикаций:
    0
    Регистрация:
    5 май 2009
    Сообщения:
    4
    Добрый день!

    invoke FindWindow, addr class, 0
    mov Phandle,eax
    invoke EnumChildWindows, Phandle, EnumProc,0

    EnumProc proc Chandle:dword
    local buffer[256]:byte
    local clname[64]:byte
    invoke GetWindowText, Chandle, addr buffer, 255
    invoke lstrcmp, addr buffer, addr drivv
    or eax,eax
    jnz NextCWin
    mov ebx,Chandle
    invoke SendMessage, Chandle, WM_LBUTTONDOWN, 0,0
    invoke SendMessage, Chandle, WM_LBUTTONUP,0,0
    jmp @F
    NextCWin: mov eax, Chandle
    @@: ret
    EnumProc endp

    Столкнулся с проблемой зависания EnumChildWindows..Смысл программы в двух словах- нахожу окно, ищу на нем кнопку нажимаю ее, далее открывается другое окно поверх первого, но у меня дальше этого Enum`a никуда не идет..
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Нарушена модель возврата, изза того что не верный прототип, искажается стек. У калбака два параметра:
    http://msdn.microsoft.com/en-us/library/ms633493(VS.85).aspx
    Обычно в процедуру обратного вызова передаётся пользовательский параметр, тут также.
     
  3. mke2fs

    mke2fs New Member

    Публикаций:
    0
    Регистрация:
    5 май 2009
    Сообщения:
    4
    т.е таким образом подавать 2 параметра EnumProc proc Chandle:dword, Lparam:dword ?
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    да, два.
     
  5. mke2fs

    mke2fs New Member

    Публикаций:
    0
    Регистрация:
    5 май 2009
    Сообщения:
    4
    я не понял как использовать второй параметр в коде :dntknw: могли бы вы привести пример
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ты его сам задаешь в ноль

    invoke EnumChildWindows, Phandle, EnumProc,0

    этот ноль и будет передан как второй параметр функции EnumProc.
    просто произвольный контекст
     
  7. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    А ещё нужно вернуть тру или фолс (если я не ошибаюсь). А у тебя что-то непонятное.
     
  8. mke2fs

    mke2fs New Member

    Публикаций:
    0
    Регистрация:
    5 май 2009
    Сообщения:
    4
    а пример решения не можете привести
     
  9. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Код (Text):
    1.     invoke EnumChildWindows,eax,Enumerator,NULL
    2. proc Enumerator,hWnd:D,lParam:D
    3. local buffon du 256 dup (?)
    4. xor ebx,ebx
    5. invoke GetWindowText,[hWnd],addr buffon,10
    6. cmp eax,ebx
    7. jz @F
    8. lea esi,[buffon]
    9. mov edi,fView
    10. mov ecx,5
    11. repz cmpsd
    12. cmp ecx,ebx
    13. jnz @F
    14. stdcall Prepare,[hWnd]
    15. stdcall GetSizeOfText,[hWnd]
    16. invoke SetWindowLong,[hWnd],GWL_WNDPROC,MyPaint
    17. mov [DesktopHWND],eax
    18. mov eax,FALSE
    19. ret
    20. @@:
    21. mov eax,TRUE
    22. ret
    23. endp
    Вот и пример.... Обрати внимание на конец процедуры, где возвращается тру или фолсе.
     
  10. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Только это - фасм, но переписывать надо будет не так уж много.
    FALSE - если тебе больше не надо перечислять чилды.
     
  11. irrona

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
  12. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Z3N
    Здесь возвращается хэндл окна - ненулевое значение, поэтому всё работает. Но конечно возвратить TRUE было бы правильнее.
     
  13. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Код (Text):
    1. ;@echo off
    2. ;goto make
    3.  
    4. format PE GUI 4.0
    5. entry start
    6.  
    7. include '%fasminc%\win32a.inc'
    8.  
    9.  
    10. INFINITE   =   0FFFFFFFFh  ; Infinite timeout
    11.  
    12.  
    13. section '.code' code readable executable
    14.  
    15. align 4
    16. proc EnumChildWindowsFunc, hwnd, lParam
    17. .Buff  rb  64
    18. enter
    19.   lea eax, [.Buff]
    20.   invoke GetWindowText, [hwnd], eax, 64
    21.   lea eax, [.Buff]
    22.   invoke lstrcmpi, ButtonText, eax
    23.   test eax, eax
    24.   jnz @F
    25.   invoke SendMessage, [hwnd], WM_LBUTTONDOWN, 1, 0
    26.   invoke SendMessage, [hwnd], WM_LBUTTONUP, 1, 0
    27.   xor eax, eax
    28.   jmp .finish
    29. @@:
    30.   xor eax, eax
    31.   inc eax
    32. .finish:
    33.   return
    34. endp
    35.  
    36. align 4
    37. proc EnumWindowsFunc, hwnd, lParam
    38. .Buff  rb  256
    39. .WndRect   RECT
    40. enter
    41.   lea eax, [.Buff]
    42.   invoke GetWindowText, [hwnd], eax, 256
    43.   lea eax, [.Buff]
    44.   invoke lstrcmpi, WindowText, eax
    45.   test eax, eax
    46.   jnz @F
    47.   lea eax, [.WndRect]
    48.   invoke GetWindowRect, [hwnd], eax
    49.   push TRUE
    50.   mov eax, [.WndRect.bottom]
    51.   sub eax, [.WndRect.top]
    52.   push eax
    53.   mov eax, [.WndRect.right]
    54.   sub eax, [.WndRect.left]
    55.   push eax
    56.   push 150
    57.   push 200
    58.   push [hwnd]
    59.   call [MoveWindow]
    60.   invoke EnumChildWindows, [hwnd], EnumChildWindowsFunc, 0
    61.   xor eax, eax
    62.   jmp .finish
    63. @@:
    64.   xor eax, eax
    65.   inc eax
    66. .finish:
    67.   return
    68. endp
    69.  
    70. align 4
    71. start:
    72.   mov edi, sBuff
    73.   invoke GetWindowsDirectory, edi, 260
    74.   test eax, eax
    75.   jz @exit
    76.   invoke lstrcat, edi, szFileName
    77.   test eax, eax
    78.   jz @exit
    79.   mov [StartupInfo.cb], sizeof.STARTUPINFO
    80.   xor esi, esi
    81.   invoke CreateProcess, esi, edi, esi, esi, esi, NORMAL_PRIORITY_CLASS,\
    82.                         esi, esi, StartupInfo, ProcessInfo
    83.   test eax, eax
    84.   jz @exit
    85.   invoke WaitForInputIdle, [ProcessInfo.hProcess], INFINITE
    86.   invoke CloseHandle, [ProcessInfo.hThread]
    87.   invoke CloseHandle, [ProcessInfo.hProcess]
    88.   invoke EnumWindows, EnumWindowsFunc, esi
    89. @exit:
    90.   invoke ExitProcess, esi
    91.  
    92.  
    93. section '.data' data readable writeable
    94.  
    95. szFileName   db   '\Calc.exe',0
    96. WindowText   db   'Калькулятор',0
    97. ButtonText   db   'Hex',0
    98.  
    99.  
    100. section '.udata' readable writeable
    101.  
    102. StartupInfo    STARTUPINFO
    103. ProcessInfo    PROCESSINFO
    104. sBuff          rb  260
    105.  
    106.  
    107. section '.idata' import data readable
    108.  
    109. library kernel32,'KERNEL32.DLL',\
    110.           user32,'USER32.DLL'
    111.  
    112. include '%fasminc%\APIA\KERNEL32.INC'
    113. include '%fasminc%\APIA\USER32.INC'
    114.  
    115.  
    116. ;:make
    117. ;SET PROJECTNAME=StartCalculator
    118. ;if exist %PROJECTNAME%.exe del %PROJECTNAME%.exe
    119. ;C:\FasmC\fasm.exe %PROJECTNAME%.bat %PROJECTNAME%.exe
    120. ;pause
    121. ;cls
     
  14. kero

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

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Не пойму, что здесь вообще обсуждать, причем так долго.
    Неужели это "проблема EnumChildWindow" - внимательно прочитать справку в MSDN ?
    Такая короткая и ясная справка...
     
  15. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    kero
    Они английский язык не знают и на русском читать не умеют.)