|
|
|
Моделирование шифт-клика
|
|||
|---|---|---|---|
|
#18+
Всем доброе время суток! Я пишу программу, управляющую открытыми окнами и имитирующую для них действия пользователя. Для моделирования нажатий клавиш на клавиатуре и мышке, а также передвижений курсора использую PostMessage(Hwnd, Msg, wParam, lParam) для мыши и SendMessage(Hwnd, Msg, wParam, lParam) для клавиатуры. Проблема возникает в том случае, если мне необходимо смоделировать шифт-клик на окне, например для выделения текста в текстовом редакторе. При захвате сообщений при реальном нажатии shift и клике Spy++ пишет что получены множественные сообщения о нажатии shift и о том, что сообщения, относящиеся к кликам мышки идут с флагом MK_SHIFT. Однако, отсылая такие сообщения, а именно: PostMessage(hWnd, WM_LBUTTONDOWN, MK_LBUTTON | MK_SHIFT, (int)((y<<16)|x)); и PostMessage(hWnd, WM_LBUTTONUP, MK_SHIFT, (int)((y<<16)|x)); Попеременно с SendMessage(hWnd,WM_KEYDOWN,VK_SHIFT,1); Результатов не дает - производится обычный клик, без шифта. В хелпе по WM_KEYDOWN относительно удержания клавиш и соответствующих сообщений сказано: lParam Specifies the repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag, as shown in the following table. 0-15 Specifies the repeat count for the current message. The value is the number of times the keystroke is autorepeated as a result of the user holding down the key. If the keystroke is held long enough, multiple messages are sent. However, the repeat count is not cumulative. 16-23 Specifies the scan code. The value depends on the OEM. 24 Specifies whether the key is an extended key, such as the right-hand ALT and CTRL keys that appear on an enhanced 101- or 102-key keyboard. The value is 1 if it is an extended key; otherwise, it is 0. 25-28 Reserved; do not use. 29 Specifies the context code. The value is always 0 for a WM_KEYDOWN message. 30 Specifies the previous key state. The value is 1 if the key is down before the message is sent, or it is zero if the key is up. 31 Specifies the transition state. The value is always zero for a WM_KEYDOWN message. Верно ли я понимаю, что для моделирования продолжительного нажатия шифта и клика в это время нужно употреблять следующий код: SendMessage(hWnd,WM_KEYDOWN,VK_SHIFT,1); PostMessage(hWnd, WM_MOUSEMOVE, MK_SHIFT, (int)((y<<16)|x)); SendMessage(hWnd,WM_KEYDOWN,VK_SHIFT,((unsigned long)(2)) | ((unsigned long)(1) << 30)); PostMessage(hWnd, WM_LBUTTONDOWN, MK_LBUTTON | MK_SHIFT, (int)((y<<16)|x)); SendMessage(hWnd,WM_KEYDOWN,VK_SHIFT,((unsigned long)(3)) | ((unsigned long)(1) << 30)); PostMessage(hWnd, WM_MOUSEMOVE, MK_LBUTTON | MK_SHIFT, (int)((y<<16)|x)); SendMessage(hWnd,WM_KEYDOWN,VK_SHIFT,((unsigned long)(4)) | ((unsigned long)(1) << 30)); PostMessage(hWnd, WM_LBUTTONUP, MK_SHIFT, (int)((y<<16)|x)); SendMessage(hWnd,WM_KEYDOWN,VK_SHIFT,((unsigned long)(5)) | ((unsigned long)(1) << 30)); PostMessage(hWnd, WM_MOUSEMOVE, MK_SHIFT, (int)((y<<16)|x)); SendMessage(hWnd,WM_KEYDOWN,VK_SHIFT,((unsigned long)(6)) | ((unsigned long)(1) << 30)); SendMessage(hWnd,WM_KEYUP,VK_SHIFT,((unsigned long)(1)) | ((unsigned long)(1) << 30) | ((unsigned long)(1) << 31))); где х и у - координаты точки в окне, куда идет клик, а hWnd - хендл окна, куда шлется шифт клик? Может быть кто-то сталкивался с подобной проблемой? Буду рад любым рекомендациям! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2006, 16:52 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=363&tid=2031614]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
16ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
24ms |
get tp. blocked users: |
1ms |
| others: | 237ms |
| total: | 309ms |

| 0 / 0 |
