Хорошо, попробую дать еще инфы. Хотя, повторяю, я в этом не спец - все добыто сейчас, и делаю это также впервые
Может подтянутся знатоки и подскажут что полезное - было бы неплохо.
Первое, что хотелось бы прояснить: 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)
{
}
{
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)
{
}
Параметр wparam передаем в потоке от кнопок.
Хэндл окна ищем по заголовку.
Запускаем игру, запускаем проект - он находит окно игры и пишет об этом.
Нажимаем кнопки - меняется поле игры (как через меню).
Принцип тот же, что и у прошлого урока. Главное найти нужное сообщение.