Сейчас на форуме: asfa, surunnerr, Vicshann, zds (+4 невидимых)

 eXeL@B —› Оффтоп —› Ламерская задача покодить
Посл.ответ Сообщение

Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 04 мая 2008 22:49
· Личное сообщение · #1

Столкнулся с такой задачей, как эмулирование действий пользователя. Конкретно - надо даблкликнуть по часам в трее, и получить соответствующий эффект. Надо сказать, не ожидал такого подвоха - никак не получилось проэмулировать.
Окошки отыскал, хендлы правильные, но заслать туда даблклик - нивкакую.

Кто попробует ради эксперимента? Можно не заморачиваться с отысканием хэндлов нужных окошек, а взять нужные хэндлы посредством какой-нибудь проги... чисто эксперимент.

XP, SP1

-----
Я медленно снимаю с неё UPX... *FF_User*





Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 05 мая 2008 00:54 · Поправил: Ara
· Личное сообщение · #2

invoke SendMessage,hWnd,WM_LBUTTONDBLCLK,0,0



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 05 мая 2008 09:01
· Личное сообщение · #3

Ara spy++ показывает, что часики даблклик не получают Трей их тоже не получает...



Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 05 мая 2008 09:17
· Личное сообщение · #4

AlexZ
Я смотрел в WinSight - трэй (именно весь трэй, а не область часов) получает кучу сообщений на нажатии мышкой (WM_MouseActivate, WM_ActivateApp, WM_NCActivate и т.д.). Попытался в таком же порядке их передавать, но скорее всего туплю с передачей WParam и LParam




Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 05 мая 2008 09:54
· Личное сообщение · #5

Во, точно У мну просто там AlfaClock висела



Ранг: 107.5 (ветеран)
Активность: 0.150
Статус: Участник

Создано: 05 мая 2008 13:00
· Личное сообщение · #6

Гдето я видел чтото похожее часы это дочернее окно поэтому handle не действителен
попробуй получать хэндл так и на него слать
Wnd := FindWindow('Shell_TrayWnd', nil);
Wnd := FindWindowEx(Wnd, HWND(0), 'TrayNotifyWnd', nil);
Wnd := FindWindowEx(Wnd, HWND(0), 'TrayClockWClass', nil);

-----
Md5 fcbb6c9c9a5029b24d70f2d67c7cca74




Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 05 мая 2008 14:56
· Личное сообщение · #7

Stack
В моём первом комменте сказано, что хендлы найдены правильно. Плюс к тому, в том же комменте обозначено, что для упрощения задачи можно не заниматься отыскиванием хэндлов, потому что задача состоит не в поиске хендлов.
Вариантов посика окошек здесь два (мне известных). Через FindWindow и через Enum'ы. Ещё, наверное можно получить виндов под курсором мыши

tihiy_grom
Я пробовал через подведение курсора к окошку и через передачу координат в Param'е. И оба варианта сразу. Не проходит =(

Чуть позже для проверки решил покликать по ярлыкам десктопа и чёт тоже не получилось, но десктоп я забросил, ибо с часами в трее уже наморочился.

-----
Я медленно снимаю с неё UPX... *FF_User*





Ранг: 271.6 (наставник), 2thx
Активность: 0.30
Статус: Участник

Создано: 06 мая 2008 08:50
· Личное сообщение · #8

Можно сделать
SetCursorPos(99999,99999);
GetCursorPos(xy);
SetCursorPos(xy.x-10,xy.y-5);
и
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
Кодес действительно ламерский, но зато без использования хэндлов и 100% рабочий

-----
iNTERNATiONAL CoDE CReW




Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 06 мая 2008 16:56
· Личное сообщение · #9

Хм, как-то не подумал про маус- и киборд- (на всякий) эвенты.
А точно, работает. Только надо кликнуть три раза, чтобы первый раз установить фокус ввода и после первого клика поспать милисек так с сотню.

-----
Я медленно снимаю с неё UPX... *FF_User*




Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 06 мая 2008 19:05
· Личное сообщение · #10

все таки интересно, как послать последовательность сообщений трэю без подвода мышки.
AlexZ, пипец ты задачку задал до сих пор колупаюсь



Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 06 мая 2008 22:21 · Поправил: AlexZ
· Личное сообщение · #11

tihiy_grom
Теоритически, в WM_LBUTTONDBLCLK (и может ещё кой где) надо засылать lParam как двойное слово, в котором старшее слово - координата икс, младшее слово - координата игрек.
Но если бы всё так просто.
Кстати, щас покликаю по десктопу через маусэвенты )

О, кликается десктоп. Теперь надо юзать эвенты

-----
Я медленно снимаю с неё UPX... *FF_User*




Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 06 мая 2008 22:44
· Личное сообщение · #12

AlexZ
а в WParam что должно быть? или пустой надо передавать?



Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 06 мая 2008 23:12
· Личное сообщение · #13


WM_LBUTTONDBLCLK
fwKeys = wParam; // key flags
xPos = LOWORD(lParam); // horizontal position of cursor
yPos = HIWORD(lParam); // vertical position of cursor

fwKeys

Value of wParam. Indicates whether various virtual keys are down. This parameter can be any combination of the following values:

Value Description
MK_CONTROL Set if the CTRL key is down.
MK_LBUTTON Set if the left mouse button is down.
MK_MBUTTON Set if the middle mouse button is down.
MK_RBUTTON Set if the right mouse button is down.
MK_SHIFT Set if the SHIFT key is down.


-----
Я медленно снимаю с неё UPX... *FF_User*





Ранг: 279.1 (наставник)
Активность: 0.160
Статус: Участник
wizard

Создано: 07 мая 2008 19:45 · Поправил: MACKLIA
· Личное сообщение · #14

Spirit пишет:
Можно сделать
SetCursorPos(99999,99999);
GetCursorPos(xy);
SetCursorPos(xy.x-10,xy.y-5);
и
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
Кодес действительно ламерский, но зато без использования хэндлов и 100% рабочий


Нет не на 100%,у меня рабочий стол растянут на два монитора,а часики на первом
А зачем именно по часам кликать ,timedate.cpl запустить и сЁ - результат тотже

-----
Что один человек сделал , другой всегда сломать может...




Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 07 мая 2008 19:53
· Личное сообщение · #15

MACKLIA
что-то типа этого тебе поможет
var
r: TRect;
begin
GetWindowRect( "хэндл часов" , r);
SetCursorPos(r.left+10,r.top+5);
end;



Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 07 мая 2008 20:24
· Личное сообщение · #16

MACKLIA пишет:
А зачем именно по часам кликать ,timedate.cpl запустить и сЁ - результат тотже

Ну, задача вот такая. Заэмулировать действия юзверя.
Например у меня, на это тимедате.цпл открывается древнючий ресторатор, с внутренностями самого тимедате.

-----
Я медленно снимаю с неё UPX... *FF_User*




Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 07 мая 2008 20:42
· Личное сообщение · #17

AlexZ
Посмотри программки, типа E-Motion, AutoClickExtreme - они записывают все действия пользователя и потом их воспроизводят. Распотроши и посмотри как там это реализовано


 eXeL@B —› Оффтоп —› Ламерская задача покодить

У вас должно быть 20 пунктов ранга, чтобы оставлять сообщения в этом подфоруме, но у вас только 0

   Для печати Для печати