| Посл.ответ |
Сообщение |
|
Создано: 4 мая 2008 22:49:22 Личное сообщение #1
Столкнулся с такой задачей, как эмулирование действий пользователя. Конкретно - надо даблкликнуть по часам в трее, и получить соответствующий эффект. Надо сказать, не ожидал такого подвоха - никак не получилось проэмулировать.
Окошки отыскал, хендлы правильные, но заслать туда даблклик - нивкакую.
Кто попробует ради эксперимента? Можно не заморачиваться с отысканием хэндлов нужных окошек, а взять нужные хэндлы посредством какой-нибудь проги... чисто эксперимент.
XP, SP1
----- Firefox!
|
|
|
Создано: 5 мая 2008 00:54:56 · Поправил: Ara Личное сообщение #2
invoke SendMessage,hWnd,WM_LBUTTONDBLCLK,0,0
|
|
Создано: 5 мая 2008 09:01:52 Личное сообщение #3
Ara spy++ показывает, что часики даблклик не получают  Трей их тоже не получает...
|
|
Создано: 5 мая 2008 09:17:00 Личное сообщение #4
AlexZ
Я смотрел в WinSight - трэй (именно весь трэй, а не область часов) получает кучу сообщений на нажатии мышкой (WM_MouseActivate, WM_ActivateApp, WM_NCActivate и т.д.). Попытался в таком же порядке их передавать, но скорее всего туплю с передачей WParam и LParam
|
|
Создано: 5 мая 2008 09:54:33 Личное сообщение #5
Во, точно  У мну просто там AlfaClock висела
|
|
Создано: 5 мая 2008 13:00:06 Личное сообщение #6
Гдето я видел чтото похожее часы это дочернее окно поэтому handle не действителен
попробуй получать хэндл так и на него слать
Wnd := FindWindow('Shell_TrayWnd', nil);
Wnd := FindWindowEx(Wnd, HWND(0), 'TrayNotifyWnd', nil);
Wnd := FindWindowEx(Wnd, HWND(0), 'TrayClockWClass', nil);
----- Md5 fcbb6c9c9a5029b24d70f2d67c7cca74
|
|
Создано: 5 мая 2008 14:56:50 Личное сообщение #7
Stack
В моём первом комменте сказано, что хендлы найдены правильно. Плюс к тому, в том же комменте обозначено, что для упрощения задачи можно не заниматься отыскиванием хэндлов, потому что задача состоит не в поиске хендлов.
Вариантов посика окошек здесь два (мне известных). Через FindWindow и через Enum'ы. Ещё, наверное можно получить виндов под курсором мыши
tihiy_grom
Я пробовал через подведение курсора к окошку и через передачу координат в Param'е. И оба варианта сразу. Не проходит =(
Чуть позже для проверки решил покликать по ярлыкам десктопа и чёт тоже не получилось, но десктоп я забросил, ибо с часами в трее уже наморочился.
----- Firefox! |
|
Создано: 6 мая 2008 08:50:14 Личное сообщение #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 |
|
Создано: 6 мая 2008 16:56:01 Личное сообщение #9
Хм, как-то не подумал про маус- и киборд- (на всякий) эвенты.
А точно, работает. Только надо кликнуть три раза, чтобы первый раз установить фокус ввода и после первого клика поспать милисек так с сотню.
----- Firefox!
|
|
Создано: 6 мая 2008 19:05:38 Личное сообщение #10
все таки интересно, как послать последовательность сообщений трэю без подвода мышки.
AlexZ, пипец ты задачку задал  до сих пор колупаюсь
|
|
Создано: 6 мая 2008 22:21:07 · Поправил: AlexZ Личное сообщение #11
tihiy_grom
Теоритически, в WM_LBUTTONDBLCLK (и может ещё кой где) надо засылать lParam как двойное слово, в котором старшее слово - координата икс, младшее слово - координата игрек.
Но если бы всё так просто.
Кстати, щас покликаю по десктопу через маусэвенты )
О, кликается десктоп. Теперь надо юзать эвенты
----- Firefox! |
|
Создано: 6 мая 2008 22:44:56 Личное сообщение #12
AlexZ
а в WParam что должно быть? или пустой надо передавать?
|
|
Создано: 6 мая 2008 23:12:28 Личное сообщение #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.
----- Firefox!
|
|
Создано: 7 мая 2008 19:45:46 · Поправил: 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 запустить и сЁ - результат тотже
----- Что один человек сделал , другой всегда сломать может... |
|
Создано: 7 мая 2008 19:53:44 Личное сообщение #15
MACKLIA
что-то типа этого тебе поможет
var
r: TRect;
begin
GetWindowRect( "хэндл часов" , r);
SetCursorPos(r.left+10,r.top+5);
end;
|
|
Создано: 7 мая 2008 20:24:11 Личное сообщение #16
MACKLIA пишет:
А зачем именно по часам кликать ,timedate.cpl запустить и сЁ - результат тотже
Ну, задача вот такая. Заэмулировать действия юзверя.
Например у меня, на это тимедате.цпл открывается древнючий ресторатор, с внутренностями самого тимедате.
----- Firefox!
|
|
Создано: 7 мая 2008 20:42:35 Личное сообщение #17
AlexZ
Посмотри программки, типа E-Motion, AutoClickExtreme - они записывают все действия пользователя и потом их воспроизводят. Распотроши и посмотри как там это реализовано
|