WinApi SendMessage

Elina74


См. на рисунок. Здесь изображено окно некоторой не моей программы, которое я изучил с помощью MS Spy++. Показано, какие указатели (handle) имеет каждая часть окна, классы (class type) окон и подписи (caption) к ним.
Как узнать эти handle из другой программы?
Как сэмулировать действие: "нажать левой кнопкой мыши внутри внутреннего окна, протянуть мышь вверх, отпустить левую кнопку"?
Плиз, не пишите RTFM, я честно пытался это сделать так на VB:


tebook_hwnd = FindWindow("TForm1", "Form1")
tebook2_hwnd = FindWindowEx(tebook_hwnd, 0, "TPMultiImage", vbNullString)
Call SendMessage(tebook2_hwnd, WM_LBUTTONDOWN, 0, 0)
Call SendMessage(tebook2_hwnd, WM_MOUSEMOVE, &H6464, 0)
Call SendMessage(tebook2_hwnd, WM_LBUTTONUP, 0, 0)

maggi14

В какой конкретно момент происходит проблема? Тебе удается получить нужный хэндл?

Elina74

Удается. Причем для любых частей окна. Spy++ подтверждает, что это те же хэндлы.
Окно не реагирует на SendMessage. Никак не реагирует.

maggi14

ХЗ. Я однажды столкнулся с тем, что ОЛЕ2 приложения иногда используют стандартные виндовые мессэджи в своих грязных целях, и проги, эмулирующие клаву, не работают. Может, та же хрень?

Elina74

У меня такая мысль: может нужно предварительно "подключиться" к тому чужому окну? Листая старые попытки сделать то же самое, нахожу странные строчки, содержащие "AttachThreadInput".
А?

zontik

Это бред.
Лезть в Тред проги нужно только если ты ей что-то по ссылке(адресу) передаешь.
все должно работать убедись что у SendMessage правильные параметры (координаты относительные в клиентской области (! MK_LBUTTON не забуть в wParam)

zontik

советую использовать SBM_* , а не WM_* гемороя гораздо меньше
хотя чтобы выполнить SBM_GETRANGE тебе придется в память другого процесса лезть

Elina74

ОК. После того, как я вписал wparam он начал реагировать на сообщения о нажатии кнопки мыши. А именно, при выполнении такой проги я явственно вижу, как меняется курсор на изображение руки. А потом снова исчезает. Но не происходит то, что должно происходить при движении мыши... Все msgresult-ы равны 0.
Что означает параметр, что передается после "WM_MOUSEMOVE"? Относительный сдвиг или координаты той точки, куда мышь сдвинулась?


msgresult1 = SendMessage(tebook2_hwnd, WM_LBUTTONDOWN, MK_LBUTTON, &H1010)
Sleep (500)
msgresult2 = SendMessage(tebook2_hwnd, WM_MOUSEMOVE, MK_LBUTTON, &H2020)
Sleep (500)
msgresult3 = SendMessage(tebook2_hwnd, WM_LBUTTONUP, MK_LBUTTON, &H2020)
Sleep (500)

ALEXKIRP

поставь мсдн там есть про параметры сообщений, или win32.hlp из дистрибутива Borland C

laki

RE> Как сэмулировать действие: "нажать левой кнопкой мыши внутри внутреннего окна, протянуть мышь вверх, отпустить левую кнопку"?
Если я правильно понял, то поможет


VOID mouse_event( DWORD dwFlags,
DWORD dx,
DWORD dy,
DWORD dwData,
ULONG_PTR dwExtraInfo
);

Elina74

Я так делал, но это не интересно, поскольку эмулируется именно движение мыши. При этом безразлично, какое окно находится под мышью, ибо не указывается handle. Получается куча забавных побочных эффектов.

laki

Тогда можно попробовать dll-injection получишь доступ ко всему.

Dasar

если программа, кроме обработки сообщений, также еще сама спрашивает положения мышки, то подход с WM_Mouse-ами работать не будет

bleyman

Лови позицию мыши. Можешь ловить параметры десктопа и гарантированно загонять мышь в левый верхний угол, неважно.
Выясняй позиции нужных тебе окошек.
Эмулируй движения мыши (но уже не на ощупь, а точно зная, куда ее нужно шевелить).
Потому что окошки, строго говоря, согут игнорировать почти все.

zontik

Нафик мышку. Лучше использовать собственные сообщения контролов:
например SBM_* для скролл-бара и т.д.(большинство программ (~99.99%) используют common control.dll)

stm5643616

WM_MOUSEMOVE не следует делать, надо прямо кликать в нужную точку


procedure ClickTo(Handle: HWND; X, Y: integer);
// clicks control defined by Handle to (X, Y) point
begin
SendMessage(Handle, WM_LBUTTONDOWN, MK_LBUTTON, MakeLong(X, Y;
SendMessage(Handle, WM_LBUTTONUP, MK_LBUTTON, MakeLong(X, Y;
end;

Nika Admin

http://07l4h6reqfqji8d140kg5jv5q2uxhz6z8pr9ivzn03ze54llx7.net 07l4h6reqfqji8d140kg5jv5q2uxhz6z8pr9ivzn03ze54llx7

G0MjqkzT
Оставить комментарий
Имя или ник:
Комментарий: