Вверх ↑
Ответов: 273
Рейтинг: 29
#1: 2012-01-22 11:57:00 ЛС | профиль | цитата
Народ требует продолжения.
Хорошо, попробую дать еще инфы. Хотя, повторяю, я в этом не спец - все добыто сейчас, и делаю это также впервые
Может подтянутся знатоки и подскажут что полезное - было бы неплохо.

Первое, что хотелось бы прояснить: Master4eG, тебе оно для чего? Колись. В потемках блуждать нет желания.

Давай покажу на примере Сапера.
Window Scanner, прицел на окно. Хэндл только один - главного окна.
Игровое окно отрисовывается самостоятельно, поэтому доступа к нему нет.

Итак, максимум, что возможно в окне, перекрытом другим - управление меню.
Как послать клик - не нашел. Точнее можно отдать команду на захват мыши, и провести щелчок. Но это уже не SendMessage - придется использовать WinApi, а таких готовых компонентов вроде нету. Если нужно - пиши в IC.

Что тебе нужно из источников информации:
*Азбука программирования в Win32 API (3-е изд.). П.В.Румянцев.
  и/или Win32 API. Эффективная разработка приложений. Юрий Щупак.
    Здесь мы будем искать подходящее сообщение (а также в google и window scanner'е)
*Справочник сообщений - win32.hlp
    Здесь мы будем смотреть параметры сообщения (в случае чего - поможет translate.google.ru)
*Коды сообщений
    Здесь мы будем смотреть коды сообщений, для отправки их в компонент SendMessage.

Допустим нам нужно выбрать уровень сложности "Любитель".
1.1 Ищем сообщения для взаимодействия с меню (см. Источники).
  Нашли: wm_command
1.2 Смотрим параметры сообщения (см. Справочник).
  Нашли:
    wID = LOWORD(wParam);
    wID = Specifies the identifier of the menu item
    wParam = wId
    hwndCtl = (HWND) lParam;
    hwndCtl = Otherwise, this parameter is NULL.
    hwndCtl = 0
    Return Values = If an application processes this message, it should return zero.
  Это означает следующее:
    В wparam нужно передать ID подпункта меню.
    lparam=0.
    При удачном приеме сообщения в ответ придет 0 (нам он не особо и нужен)
1.3 Выбираем в Window Scanner окно игры и нажимаем кнопку "Меню"
1.4 Щелкаем по пункту "Любитель" и смотрим ID: 522 (#20A)
1.5 Выбираем сообщение wm_command и в wparam вписываем #20A
1.6 Отсылаем сообщение (кнопка "письмо") и наблюдаем:
  Ага, оно - размер поля изменился.
1.7 Смотрим код сообщения (см. Источники) и переводим его в десятичный вид (Win калькулятором):
  wm_command=$111=273
1.8 Записываем:
  273(522,0)
  Где:
  273 - десятичный код wm_command
  522 - wparam, десятичный ID (Компонент SendMessage принимает только десятичные числа)
  0 - lparam

Создаем проект:
код
Add(MainForm,2953706,420,280)
{
Width=270
Height=52
Caption="MineRuller"
BorderStyle=1
Position=1
link(onCreate,10331873:doFind,[])
}
Add(WinEnum,10331873,483,287)
{
link(onFindWindow,14717890:doStrCat,[])
link(Caption,4040631:Value,[])
}
Add(Memory,4040631,483,238)
{
Default=String(Сапер)
}
Add(Button,910300,371,385)
{
Left=135
Width=65
Caption="Любитель"
link(onClick,5497166:doData,[])
}
Add(Edit,1552837,567,287)
{
Width=135
}
Add(SendMessage,12073427,483,385)
{
Point(Message)
link(Handle,10331873:Handle,[])
link(Message,3792509:Value,[])
}
Add(Memory,3792509,504,329)
{
Default=Integer(273)
}
Add(StrCat,14717890,525,287)
{
Str1="Найдено окно: "
link(onStrCat,1552837:doText,[])
}
Add(Button,5006305,371,427)
{
Left=200
Width=65
Caption="Новичок"
link(onClick,13943954:doData,[])
}
Add(DoData,5497166,420,385)
{
Data=Integer(522)
link(onEventData,16612951:doWork2,[])
}
Add(DoData,13943954,420,427)
{
Data=Integer(521)
link(onEventData,16612951:doWork3,[(466,433)])
}
Add(HubEx,16612951,462,385)
{
link(onEvent,12073427:doSendMessage,[])
}
Add(StyleXP,8336760,420,329)
{
}
В Memory над SendMessage храним код сообщения.
Параметр wparam передаем в потоке от кнопок.
Хэндл окна ищем по заголовку.
Запускаем игру, запускаем проект - он находит окно игры и пишет об этом.
Нажимаем кнопки - меняется поле игры (как через меню).

Принцип тот же, что и у прошлого урока. Главное найти нужное сообщение.
карма: 0

2
Голосовали:Konst, Master4eG