invoke SendMessage

Тема в разделе "WASM.BEGINNERS", создана пользователем Semiono, 23 мар 2010.

  1. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    Код (Text):
    1. include '%fasm%\win32ax.inc'
    2.  
    3. start:
    4.         pushad
    5.         invoke FindWindow,"SciCalc",NULL
    6.         mov [hWnd],eax
    7.         invoke FindWindowEx,[hWnd],NULL,NULL,4
    8.         mov [cWnd],eax
    9.         invoke SendMessage,[cWnd],WM_LBUTTONDOWN,NULL,NULL
    10.         popad
    11. exit:
    12.         invoke ExitProcess,NULL
    13.  
    14. section '.idata' import data readable writeable
    15.         library kernel32,'KERNEL32.DLL',user32,'USER32.DLL'
    16.         include '%fasm%\api\kernel32.inc'
    17.         include '%fasm%\api\user32.inc'
    18.  
    19.         cWnd dd ?
    20.         hWnd dd ?
    Пытаюсь тиснуть в калькулятор, много ли косяков понаделал тут?
     
  2. Flint_ta

    Flint_ta New Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    312
    На четверку хочешь нажать?

    Код (Text):
    1. include '%fasm%\win32ax.inc'
    2.  
    3. start:
    4.         pushad
    5.         invoke FindWindow,"SciCalc",NULL
    6.         mov [hWnd],eax
    7.         invoke FindWindowEx,[hWnd],NULL,NULL,button
    8.         mov [cWnd],eax
    9.         invoke SendMessage,[cWnd],BM_CLICK,NULL,NULL
    10.         popad
    11. exit:
    12.         invoke ExitProcess,NULL
    13.  
    14. section '.idata' import data readable writeable
    15.         library kernel32,'KERNEL32.DLL',user32,'USER32.DLL'
    16.         include '%fasm%\api\kernel32.inc'
    17.         include '%fasm%\api\user32.inc'
    18.  
    19.         cWnd dd ?
    20.         hWnd dd ?
    21.         button db '4', 0
     
  3. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    Ай какой ты молодец! 5+
    А вот pushad / popad это действительно помогает или ненужный тут код? =)
    Я просто чё-то помню что регистры надо сохранять, хотя не разу не видел, чтоб кто-то
    в таких случая pushad использовал, вообщем это я наобум написал =)
     
  4. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    Код (Text):
    1. start:
    2.         invoke ShellExecute,NULL,NULL,'calc.exe',NULL,NULL,SW_SHOW
    3.         invoke Sleep,20
    4.  
    5.         invoke FindWindow,"SciCalc",NULL
    6.         mov [hWnd],eax
    7.         invoke FindWindowEx,[hWnd],NULL,NULL,button
    8.         mov [cWnd],eax
    9.         invoke SendMessage,[cWnd],BM_CLICK,NULL,NULL
    Sleep() выручил, но может быть что-то удачнее есть или тут нет вариантов?
     
  5. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    Semiono, в данном случае это как мыть ж*, перед тем как сходить облегчиться.
     
  6. Asterix

    Asterix New Member

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

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

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    упс, теперь калькулятор по другому пути лежит GetSystemDirectory надо вместо GetWindowsDirectory
     
  8. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    Код (Text):
    1. start:
    2.         invoke ShellExecute,NULL,NULL,'desk.cpl',NULL,NULL,SW_SHOW
    3.         invoke Sleep,200
    4.         invoke FindWindow,"#32770",NULL
    Открыл desk.cpl ресхакером, а там всего одно окно (rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,1)
    видимо поэтому в окне под кодовым названием )) desk.cpl,,-1 нажать button1 не получается...
    Что за фокусы с этими CPL?

    Asterix, спасибо большое за пример!
     
  9. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    [​IMG]
    Button1
    [​IMG]
    Вид изнутри 0_o
     
  10. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    Код (Text):
    1. section '.udata' readable writeable
    2. ProcessInfo    PROCESSINFO
    это откуда? у меня глючит. Error: Illegal Instruction
     
  11. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    надо проверить структуры, возможно автор Fasm'а подкорректировал имена
     
  12. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    Жаль, у вас код навороченный, хотелось его поглядеть в работе, может пригодилось бы мне.
     
  13. Asterix

    Asterix New Member

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

    дело в том что сорц писался давно, в старых версиях фасма компилилось,
    там как раз было такое неправильное имя структуры
     
  14. 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. locals
    18. .Buff  rb  64
    19. endl
    20.   lea eax, [.Buff]
    21.   invoke GetWindowText, [hwnd], eax, 64
    22.   lea eax, [.Buff]
    23.   invoke lstrcmpi, ButtonText, eax
    24.   test eax, eax
    25.   jnz @F
    26.   invoke SendMessage, [hwnd], WM_LBUTTONDOWN, 1, 0
    27.   invoke SendMessage, [hwnd], WM_LBUTTONUP, 1, 0
    28.   xor eax, eax
    29.   jmp .finish
    30. @@:
    31.   xor eax, eax
    32.   inc eax
    33. .finish:
    34.   ret
    35. endp
    36.  
    37. align 4
    38. proc EnumWindowsFunc, hwnd, lParam
    39. locals
    40. .Buff  rb  256
    41. .WndRect   RECT
    42. endl
    43.   lea eax, [.Buff]
    44.   invoke GetWindowText, [hwnd], eax, 256
    45.   lea eax, [.Buff]
    46.   invoke lstrcmpi, WindowText, eax
    47.   test eax, eax
    48.   jnz @F
    49.   lea eax, [.WndRect]
    50.   invoke GetWindowRect, [hwnd], eax
    51.   push TRUE
    52.   mov eax, [.WndRect.bottom]
    53.   sub eax, [.WndRect.top]
    54.   push eax
    55.   mov eax, [.WndRect.right]
    56.   sub eax, [.WndRect.left]
    57.   push eax
    58.   push 150
    59.   push 200
    60.   push [hwnd]
    61.   call [MoveWindow]
    62.   invoke EnumChildWindows, [hwnd], EnumChildWindowsFunc, 0
    63.   xor eax, eax
    64.   jmp .finish
    65. @@:
    66.   xor eax, eax
    67.   inc eax
    68. .finish:
    69.   ret
    70. endp
    71.  
    72. align 4
    73. start:
    74.   xor esi, esi
    75.   mov edi, sBuff
    76.   invoke GetSystemDirectory, edi, 260
    77.   test eax, eax
    78.   jz @exit
    79.   invoke lstrcat, edi, szFileName
    80.   test eax, eax
    81.   jz @exit
    82.   mov [StartupInfo.cb], sizeof.STARTUPINFO
    83.   invoke CreateProcess, esi, edi, esi, esi, esi, NORMAL_PRIORITY_CLASS,\
    84.                         esi, esi, StartupInfo, ProcessInfo
    85.   test eax, eax
    86.   jz @exit
    87.   invoke WaitForInputIdle, [ProcessInfo.hProcess], INFINITE
    88.   invoke CloseHandle, [ProcessInfo.hThread]
    89.   invoke CloseHandle, [ProcessInfo.hProcess]
    90.   invoke EnumWindows, EnumWindowsFunc, esi
    91. @exit:
    92.   invoke ExitProcess, esi
    93.  
    94.  
    95. section '.data' data readable writeable
    96.  
    97. szFileName   db   '\Calc.exe',0
    98. WindowText   db   'Калькулятор',0
    99. ButtonText   db   'Hex',0
    100.  
    101.  
    102. section '.udata' readable writeable
    103.  
    104. StartupInfo    STARTUPINFO
    105. ProcessInfo    PROCESS_INFORMATION
    106. sBuff          rb  260
    107.  
    108.  
    109. section '.idata' import data readable
    110.  
    111. library kernel32,'KERNEL32.DLL',\
    112.           user32,'USER32.DLL'
    113.  
    114. include '%fasminc%\APIA\KERNEL32.INC'
    115. include '%fasminc%\APIA\USER32.INC'
    116.  
    117.  
    118. ;:make
    119. ;SET PROJECTNAME=StartCalculator
    120. ;if exist %PROJECTNAME%.exe del %PROJECTNAME%.exe
    121. ;C:\Fasm\fasm.exe %PROJECTNAME%.bat %PROJECTNAME%.exe
    122. ;pause
    123. ;cls
     
  15. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    В английской версии
    WindowText db 'Calculator',0
    ButtonText db 'pi',0
    :)
     
  16. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    Кароче период застоя!
    Во-первых не уверен нужно ли тут искать FindWindowEx
    Код (Text):
    1.         invoke FindWindow,"#32770",NULL
    2.         mov [hWnd],eax
    3.         invoke FindWindowEx,[hWnd],NULL,NULL,button
    Может достаточно FindWindow уровня?

    Всякие дополнения не помогли, хотя может имеет смысл их далее использовать и в каком порядке?
    invoke SetActiveWindow,[hWnd]
    invoke EnableWindow,[hWnd],TRUE
    invoke SetFocus,[hWnd]
    ...??

    WM_COMMAND - в этом окне наверное нельзя прикрутить, так как меню здесь нет.

    IDOK и IDCANCEL - это же то же самое что ~ button 0x00000001 ? Или чем-то лучше!

    Вообщем (Display Properties) окно не реагирует, CPL окна это вам не calc.exe а гораздо хуже :\
     
  17. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    #define IDOK 1
    #define IDCANCEL 2
    #define IDABORT 3
    #define IDRETRY 4
    #define IDIGNORE 5
    #define IDYES 6
    #define IDNO 7

    заглянь на дефайны и все станет на свои места.)
     
  18. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
  19. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Только предварительно нужно получить хэндл процесса, через toolhelp...
     
  20. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    Вот когда всё покатило, мне вспомнилась одна фитча! Последний штрих! Сейчас проверю, но наверное @HIDE тут не поможет, так как внешний процессвызывается, но хотябы его налету скрыть. =)

    Код (Text):
    1. invoke ShellExecute, NULL, NULL, 'rundll32.exe', 'Shell32.dll,Control_RunDLL desk.cpl desk,@Themes Action:OpenTheme /File:"C:\I\Resources\Themes\Blackbox.theme"', NULL, SW_SHOW
    ,SW_HIDE подставлю! Но может идеи ищё будут? :)