WM_KEYDOWN![]() |
||
| Наши проекты: | · Журнал Discuz!ML · · Алгоритмы · Естественные науки · Wiki · DRKB · Помощь проекту | |
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | DigiMania | RSS |
| [37.187.8.165] |
|
Правила раздела Visual C++ / MFC / WTL (далее Раздела)
FAQ Раздела
Обновления для FAQ Раздела
Поиск по Разделу
MSDN Library Online| Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
WM_KEYDOWN|
Сообщ. #16,
|
|
|
|
Цитата Duke Nuken @ Вау. Я проникся. А вообще поработав с С# 2 года похоже тупееш Вот накидал сообщения для Alt + A (выдедение текста в блокноте) и оно в точности повторяет то что происходит при нажатии с клавиатуры, за отличием одного - не работает. В чем подвох? ![]() ![]() HWND h = ::FindWindow(NULL, L"1.txt - Notepad"); if (h != NULL) { HWND child = ::FindWindowEx(h,NULL,L"Edit", NULL); UINT lparam_Ctrl1 = ::MapVirtualKey(VK_CONTROL, 0) << 16 | 1 ; UINT lparam_A1 = ::MapVirtualKey((int)'A', 0) << 16 | 1 ; UINT lparam_A2 = 1 << 31 | 1 << 30 | ::MapVirtualKey((int)'A', 0) << 16 | 1 ; UINT lparam_Ctrl2 = 1 << 31 | 1 << 30 | ::MapVirtualKey(VK_CONTROL, 0) << 16 | 1 ; //Ctrl + A LRESULT pl1_Ctrl = ::PostMessage(child, WM_KEYDOWN, VK_CONTROL, lparam_Ctrl1 ); LRESULT pl1_A = ::PostMessage(child, WM_KEYDOWN, (int)'A', lparam_A1 ); LRESULT pl2_A = ::PostMessage(child, WM_KEYUP, (int)'A', lparam_A2); LRESULT pl2_Ctrl = ::PostMessage(child, WM_KEYUP, VK_CONTROL, lparam_Ctrl2); } И что Spy`ем смотрел - один в один с клавиатурой? Добавлено Более того - у меня даже после твоих сообщений посылает WM_CHAR!!! |
|
Сообщ. #17,
|
|
|
|
Я тоже заметил этот побочный эффект
Но ты можеш мне показать WM_CHAR в коде? Почему он происходит, а выделение текста не отрабатывает - вот в чем загадка. Да Spy++ смотрел - один в один с клавиатурой. Я подозреваю там еще какието события нужно посылать чтобы заработало. |
|
Сообщ. #18,
|
|
|
|
Акселератор не срабатывает, поэтому и WM_KEYDOWN + WM_KEYUP преобразуются в WM_CHAR. Если послать сообщение напрямую с ID=25, то все происходит.
![]() ![]() HWND h = ::FindWindow(NULL, L"Безымянный - Блокнот"); if (h != NULL) { LRESULT pl1_Ctrl = ::PostMessage(h, WM_COMMAND, 0x10019, 0x0 ); } |
|
Сообщ. #19,
|
|
|
|
Цитата evGenius @ Акселератор не срабатывает, поэтому и WM_KEYDOWN + WM_KEYUP преобразуются в WM_CHAR. Если послать сообщение напрямую с ID=25, то все происходит. ![]() ![]() HWND h = ::FindWindow(NULL, L"Безымянный - Блокнот"); if (h != NULL) { LRESULT pl1_Ctrl = ::PostMessage(h, WM_COMMAND, 0x10019, 0x0 ); } Не знаю. У меня не работает, хотя идея вроде как правильная. |
|
Сообщ. #20,
|
|
|
|
Цитата Duke Nuken @ Я тоже заметил этот побочный эффект Но ты можеш мне показать WM_CHAR в коде? Почему он происходит Блин, последний мой пост в данной ветке. Я тут для кого распиняюсь? Не посмотреть было про упомянутую TranslateMessage() ?Цитата MSDN: TranslateMessage WM_KEYDOWN and WM_KEYUP combinations produce a WM_CHAR or WM_DEADCHAR message. Цитата а выделение текста не отрабатывает С аккселераторами, которые с клавишами-модификаторами, дополнительная фишка - посылки PostMessage недостаточно, нужно еще дополнительно обновить "keyboard input-state table" в нужном потоке. Вот такой код может сработать (закомментарены те части, без которых генерация аккселератора тоже произойдет). Разбирайся сам, раз не желаешь слушать. ![]() ![]() if (h != NULL) { HWND child = ::FindWindowEx(h,NULL,"Edit", NULL); UINT lparam_Ctrl1 = ::MapVirtualKey(VK_CONTROL, 0) << 16 | 1 ; UINT lparam_A1 = ::MapVirtualKey((int)'A', 0) << 16 | 1 ; UINT lparam_A2 = 1 << 31 | 1 << 30 | ::MapVirtualKey((int)'A', 0) << 16 | 1 ; UINT lparam_Ctrl2 = 1 << 31 | 1 << 30 | ::MapVirtualKey(VK_CONTROL, 0) << 16 | 1 ; DWORD pid; DWORD tid = GetWindowThreadProcessId(child, &pid); HANDLE hProc = OpenProcess(PROCESS_QUERY_INFORMATION | SYNCHRONIZE, FALSE, pid); //Ctrl + A AttachThreadInput(GetCurrentThreadId(), tid, TRUE); LRESULT pl1_Ctrl = ::PostMessage(child, WM_KEYDOWN, VK_CONTROL, lparam_Ctrl1 ); WaitForInputIdle(hProc, INFINITE); BYTE state[256]; GetKeyboardState(state); state[VK_CONTROL] = 0x80; SetKeyboardState(state); LRESULT pl1_A = ::PostMessage(child, WM_KEYDOWN, (int)'A', lparam_A1 ); WaitForInputIdle(hProc, INFINITE); /* GetKeyboardState(state); state['A'] = 0x80; SetKeyboardState(state); */ LRESULT pl2_A = ::PostMessage(child, WM_KEYUP, (int)'A', lparam_A2); WaitForInputIdle(hProc, INFINITE); /* GetKeyboardState(state); state['A'] = 0x0; SetKeyboardState(state); */ LRESULT pl2_Ctrl = ::PostMessage(child, WM_KEYUP, VK_CONTROL, lparam_Ctrl2); WaitForInputIdle(hProc, INFINITE); /* GetKeyboardState(state); state[VK_CONTROL] = 0x0; SetKeyboardState(state); */ AttachThreadInput(GetCurrentThreadId(), tid, FALSE); } |
|
Сообщ. #21,
|
|
|
|
Hryak - гений! Код работает.
|
|
Сообщ. #22,
|
|
|
|
Всем доброе время суток.
У меня такой вопрос. Нужно симулировать нажатие [ENTER] во внешней апликации, когда апликация не имеет фокуса. Когда сам нажимаю [ENTER] и смотрю через Spy то вижу следуюшее три строчки <0001> 01160386 P WM_KEYDOWN nVirtKey: VK_RETURN cRepeat:1 ScanCode:1C fExtended:0 fAltDown:0 fRepeat:0 fUp:0 [wParam:0000000D lParam:001C0001] <0002> 01160386 P WM_CHAR chCharCode:"(13) cRepeat:1 ScanCode:1C fExtended:0 fAltDown:0 fRepeat:0 fUp:0 [wParam:0000000D lParam:001C0001] <0003> 01160386 P WM_KEYUP nVirtKey: VK_RETURN cRepeat:1 ScanCode:1C fExtended:0 fAltDown:0 fRepeat:1 fUp:1 [wParam:0000000D lParam:C01C0001] Вот мой код. ![]() ![]() Const VK_RETURN = &HD Const WM_KEYDOWN = &H100 Const WM_KEYUP = &H101 Const WM_CHAR = &H102 Result = SendMessage(WindhWnd, WM_KEYDOWN, VK_RETURN, &H1C0001) Result = SendMessage(WindhWnd, WM_CHAR, VK_RETURN, 1) Result = SendMessage(WindhWnd, WM_KEYUP, VK_RETURN, &H1C0001) И это код даёт следуюший результат Spy (как такового нажатия не происходит) <0001> 01160386 S WM_KEYDOWN nVirtKey: VK_RETURN cRepeat:62206 ScanCode:13 fExtended:0 fAltDown:0 fRepeat:0 fUp:0 [wParam:0000000D lParam:0013F304] <0002> 01160386 R WM_KEYDOWN lResult:00000001 <0003> 01160386 S WM_CHAR chCharCode:"(13) cRepeat:62206 ScanCode:13 fExtended:0 fAltDown:0 fRepeat:0 fUp:0 [wParam:0000000D lParam:0013F2FE] <0004> 01160386 R WM_CHAR lResult:00000000 <0005> 01160386 S WM_KEYUP nVirtKey: VK_RETURN cRepeat:62212 ScanCode:13 fExtended:0 fAltDown:0 fRepeat:0 fUp:0 [wParam:0000000D lParam:0013F304] <0006> 01160386 R WM_KEYUP lResult:00000000 Вопрос 1)Сразу видно что я напортачил с lParam. Неподскажите как его высчитывать. Вопрос 2) Что обозначают след буквы P S R (Spy) Могу предположить PostMessage SendMessage Result |
|
|