передача сообщений окну

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

передача сообщений окну

Сообщение Sirik » 12.04.2007 (Чт) 9:58

вобщем есть такая задача:
1. есть 2 окна (например Word и Excel) надо отлавливать из первого окна сочитание клавишь Shift+F1...Shift+F12 и отправлять второму F1...F12

2. надо определить список окон (например как в Панели задач).

зы. вторая задача менее важна, чем первая

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.04.2007 (Чт) 11:18

И что в этом направлении уже делалось? и что не удалось?
Изображение

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 12.04.2007 (Чт) 11:26

делалось вот что:
реализовал глобальный "отлов" нажатие отдельной клавиши (Shift, клавишь F1..F12 надо знать константы). вот примерный код:
Код: Выделить всё

Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

Function ShiftKey() As Boolean
    ShiftKey = (GetAsyncKeyState(vbKeyShift) And &H8000)
End Function




1. как отследить комбинацию нажатий? т.е. Shift+F1...F12
2. как "понять", что нажатие произошло имеено в том окне что надо?
3. как имитировать нажатие в одельном окне пока не знаю(

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.04.2007 (Чт) 11:36

1) В ворде есть свои мощные средства для отлова сочетаний клавиш. См. KeyBindings. И в excel есть Application.OnKey.
2) А вот этот код много раз приводился.

1. См. 1)
2. См. 1)
3. Сделать его активным.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 12.04.2007 (Чт) 11:43

может я просто не точно объяснил суть задачи...
окна word'a и exel'я я взял для примера, реально рабочими окнами будут окна некой игры.

так вот, надо отловить вышеуказанные сочитания клавишь с первого окна и передать во второе, но только не комбинацию Shift+..., а просто клавишу


зы. надеюсь час выразился более-менее )

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 12.04.2007 (Чт) 11:51

Подробнее об игре. Оконная или полноэкранная?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 12.04.2007 (Чт) 11:54

можно играть как в оконном режиме, так и в полноэкранном

игра lineage2 :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 12.04.2007 (Чт) 11:56

Я не знаю такой. Она DX или OGL ?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 12.04.2007 (Чт) 12:06

Она DX.
Хакер ты серьезно ни разу не видел даже упоминаний о ней?
Если всё делать своими ручками, они скоро отвалятся !

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 12.04.2007 (Чт) 12:09

Ок. А у неё надо ловить или ей надо слать?

+ Она будет активна или активна будет какая то другая программа?


Серьёзно.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 12.04.2007 (Чт) 12:21

да, оба окна игры будут открыты, одно поверх другого

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 12.04.2007 (Чт) 12:51

Какое из них будет активным ?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 12.04.2007 (Чт) 13:01

ну пусть первое.

я разбил задачу на пункты:
1. определение hwnd окна, с которого будем "сдирать" сочитание и hwnd окна, куда будем передовать
2. отлов нажатие комбинаций кнопок
3. проверка: если нажата заданая комбинация и активное окно являеться тем за которым мы следим, то тогда передаем нажатие кнопки

зы. пункт 1 будет красивее реализовать через список окон, но только тех что есть в Панели задач.

зы2. п.2 отлов делаю вот так (для комбинации Shift+F1):
CBool(GetAsyncKeyState(vbKeyF1) And &H8000) And CBool(GetAsyncKeyState(vbKeyShift) And &H8000)

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 12.04.2007 (Чт) 13:47

+

и еще один вопрос: допустим в заданом окне была нажата комбинация неких кнопок (Shift+F1).
можно как-то отменить это сочетание в заданом окне?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 12.04.2007 (Чт) 14:47

Я не понимаю, как ты собираешься перехватывать обработчик кейдауна в чужом приложении. Особенно если это приложения использует DirectInput.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 12.04.2007 (Чт) 14:52

не знаю как и что использует, но вышеуказанный код работает)

и еще: список окон я уже получаю) осталось дело лишь за малым: как передать нажатие кнопки в другое окно

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 12.04.2007 (Чт) 15:27

SendMessage
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 12.04.2007 (Чт) 15:31

м-да... это логично, а где найти список флагов и кодов клавишь ?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 12.04.2007 (Чт) 16:12

Нуу..... как тебе сказать... в MSDN... наверное.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 13.04.2007 (Пт) 12:18

в общем все получилось как хотелось, но есть еще один вопросик:
как отменить последнее нажатие кнопки/сочитание кнопок ?

Cytron
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 266
Зарегистрирован: 15.02.2007 (Чт) 21:09

Сообщение Cytron » 14.04.2007 (Сб) 15:43

способ есть, но лучше не мучайся :roll:

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 21.04.2007 (Сб) 9:27

в общем так...
программа как-то странно работает: при первой передачи сообщения - все ок, но при повторных - второе окно не реагирует.

не могу понять в чем дело...
пробовал использовать фун-ции как SendMessage так и PostMessage - результат одиннаковый.

вот краткий код посылки сообщения:
Код: Выделить всё
res = SendMessage(iii, WM_KEYDOWN, VK_F1, 0)
res = SendMessage(iii, WM_KEYUP, VK_F1, 0)


зы. может я неправально понимаю что значить "нажать" и "отпустить", может надо как-то по-другому комбинировать
?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.04.2007 (Сб) 9:39

А флаги в lParam за тебя кто выставлять будет?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 21.04.2007 (Сб) 10:53

Серж, но почему раньше все работало? что за странности?

насчет флагов: надо выставлять только в когда посылаешь сообщение о нажатии или надо посылать при отпускании тоже?

зы. и не можешь подсказать какие именно надо выставить флаги? а то что-то я не понимаю(

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 21.04.2007 (Сб) 11:17

Их надо всегда выставлять.
Легче всего, погляди spyxx-ом, какие они должны быть, и выставь такие же.
Изображение

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 21.04.2007 (Сб) 13:09

вот такая информация была получена:
WM_KEYDOWN nVirtKey:VK_F12 cRepeat:1 ScanCode:58 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
WM_KEYUP nVirtKey:VK_F12 cRepeat:1 ScanCode:58 fExtended:0 fAltDown:0 fRepeat:1 fUp:1

как теперь эти составляющие перевести в десятичный вид?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 21.04.2007 (Сб) 13:11

Щёлкнуть на сообщение два раза и списать готовый шестнадцатеричный lParam.
Изображение

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 21.04.2007 (Сб) 13:24

и того получаеться 00580001 - или чего-то недопонимаю, но это довольно большое число получаеться(
в описание от 0 до 31

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.04.2007 (Сб) 13:30

Ты понимаешь разницу между "32 бита" и "32"? :roll:
Наверняка ещё и ByRef этот lParam передаёшь.
Последний раз редактировалось GSerg 21.04.2007 (Сб) 13:35, всего редактировалось 1 раз.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 21.04.2007 (Сб) 13:33

нет, по ByVal передавал. а насчет размера - ступил(


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 92

    TopList