postmessage...

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
tss050
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 22.10.2009 (Чт) 13:57

postmessage...

Сообщение tss050 » 22.10.2009 (Чт) 14:22

Добрый день!
скажите, а почему может не работать API функция postmessage
т.е.
есть сторонне приложение, у него есть горячие клавиши, допустим f8
в приложении на бэйсике при помощи FindWindow нахожу номер окна программы,
далее в программе
Код: Выделить всё
Call PostMessage(hwnd, WM_F8, 0&, 0&)

WM_F8 объявлена как константа
Public Const WM_F8 = &H77
..в итоге функция возвращает 1, а программа получатель сообщения не срабатывает??
спасибо.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: postmessage...

Сообщение Денис » 22.10.2009 (Чт) 14:32

Не знаю почему, но действительно не работает. Я недавно с этим столкнулся. Решил проблему заменой PostMessage на SendMessage. Она вообще-то является блокирующей, но в Вашем случае не должна выполняться слишком долго.

А, и ещё, если не получаете возвращаемое значение, уберите Call и скобки. Это лишнее. SendMessage hwnd, WM_F8, 0&, 0&
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

tss050
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 22.10.2009 (Чт) 13:57

Re: postmessage...

Сообщение tss050 » 22.10.2009 (Чт) 15:03

[quote="Денис"]Не знаю почему, но действительно не работает. Я недавно с этим столкнулся. Решил проблему заменой PostMessage на SendMessage. Она вообще-то является блокирующей, но в Вашем случае не должна выполняться слишком долго.

...да нет..
sendmessage в моем случае возвращает 0
и еще: а как можно узнать код для сочетания клавшиш, например: ctrl + space??

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: postmessage...

Сообщение Денис » 22.10.2009 (Чт) 15:40

Коды клавиш есть в VB, коды модификаторов тоже есть. Посылаете их, наверное, объединяя оператором AND. Не знаю, надо проверить.
В общем, как-то так:
Код: Выделить всё
vbCtrlMask AND vbKeySpace
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: postmessage...

Сообщение iGrok » 22.10.2009 (Чт) 15:46

Денис писал(а):Коды клавиш есть в VB, коды модификаторов тоже есть. Посылаете их, наверное, объединяя оператором AND. Не знаю, надо проверить.
В общем, как-то так:
Код: Выделить всё
vbCtrlMask AND vbKeySpace

Не знаю, правилен ли подход в целом, но как минимум, не AND, а OR.
label:
cli
jmp label

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: postmessage...

Сообщение Денис » 22.10.2009 (Чт) 15:55

iGrok писал(а):Не знаю, правилен ли подход в целом, но как минимум, не AND, а OR.

В любом случае проверять надо на живом коде, но по логике предполагаю, что OR нужно было бы использовать для получения пересечения нескольких модификаторов, например:
Код: Выделить всё
vbCtrlMask OR vbAltMask AND vbKeySpace

Возможно код клавиши с кодом модификатора тоже пересекается, а не объединяется.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: postmessage...

Сообщение iGrok » 22.10.2009 (Чт) 16:03

Денис писал(а):
Код: Выделить всё
vbCtrlMask OR vbAltMask AND vbKeySpace

Возможно код клавиши с кодом модификатора тоже пересекается, а не объединяется.

Мда. Ты, кажется, пересечение с объединением перепутал местами.
Сколько по-твоему будет &h0100 AND &h0001?
label:
cli
jmp label

arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

Re: postmessage...

Сообщение arvitaly » 22.10.2009 (Чт) 18:25

SendMessage - команда для послания любого сообщения, а не конкретного сообщения о нажатии клавиши
например так
SendMessage hwnd, WM_KEYDOWN, WM_F8, 0&

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: postmessage...

Сообщение Денис » 22.10.2009 (Чт) 18:30

iGrok писал(а):Мда. Ты, кажется, пересечение с объединением перепутал местами.

Не судите строго. Конец рабочего дня...
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: postmessage...

Сообщение iGrok » 22.10.2009 (Чт) 19:03

Всякие альты и прочее всё-таки посылаются через второй параметр, а не объединением кодов.

Тут подробнее: http://msdn.microsoft.com/en-us/library/ms646280.aspx
label:
cli
jmp label

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: postmessage...

Сообщение Nord777 » 22.10.2009 (Чт) 21:42

Всякие альты и прочее всё-таки посылаются через второй параметр, а не объединением кодов.
Ты ошибся. Код клавиши через wparam, а вторым параметром тип сообщения WM_....
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: postmessage...

Сообщение iGrok » 23.10.2009 (Пт) 0:07

Nord777 писал(а):
Всякие альты и прочее всё-таки посылаются через второй параметр, а не объединением кодов.
Ты ошибся. Код клавиши через wparam, а вторым параметром тип сообщения WM_....

Я не ошибся, а несколько неверно донёс мысль =)
Я имел в виду, что сообщение WM_KEY... имеет два параметра - wparam и lparam (3й и 4й параметры SendMessage), а второй - это "второй из пары wparam/lparam". То есть lparam. )
label:
cli
jmp label

arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

Re: postmessage...

Сообщение arvitaly » 23.10.2009 (Пт) 0:36

Всякие альты и прочее всё-таки посылаются через второй параметр, а не объединением кодов.


Нет посылаются они через wParam, а вот чтобы послать комбинацию судя по всему нужен lParam, но как - что-то непонятно :D

Александр_ФФ
Обычный пользователь
Обычный пользователь
 
Сообщения: 93
Зарегистрирован: 23.11.2008 (Вс) 11:09
Откуда: Северодвинск

Re: postmessage...

Сообщение Александр_ФФ » 25.10.2009 (Вс) 13:28

Извините, что вклиниваюсь..
Не подскажете, почему не получается обновить окно Оперы так:
Код: Выделить всё
h = FindWindow(vbNullString, "Пустая страница - Opera")

SendMessage h, vbKeyDown, vbKeyF5, 0 'так не получается
PostMessage h, vbKeyF5, 0, 0 'так не получается тоже


arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

Re: postmessage...

Сообщение arvitaly » 25.10.2009 (Вс) 13:55

Не подскажете, почему не получается обновить окно Оперы так:


А что такое vbKeyDown?

Александр_ФФ
Обычный пользователь
Обычный пользователь
 
Сообщения: 93
Зарегистрирован: 23.11.2008 (Вс) 11:09
Откуда: Северодвинск

Re: postmessage...

Сообщение Александр_ФФ » 25.10.2009 (Вс) 14:09

arvitaly писал(а):А что такое vbKeyDown?

я думал, что тоже, что и WM_KEYDOWN. уже понял, что не это.
и вообще, где вы константы WM_*** берёте?
PostMessage h, vbKeyF5, 0, 0 ' возвращает 1, но ничего не происходит.
С непустой страницей тоже ничего не происходит.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: postmessage...

Сообщение iGrok » 25.10.2009 (Вс) 14:32

Александр_ФФ писал(а):и вообще, где вы константы WM_*** берёте?

Api guide, Api viewer, заголовочные файлы от VC++. Гугль, в конце концов. )
label:
cli
jmp label

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

Re: postmessage...

Сообщение Хакер » 25.10.2009 (Вс) 14:33

Api guide, Api viewer, заголовочные файлы от VC++. Гугль, в конце концов. )

Нет. Всё это неправильно. Правильный ответ: MSDN. Там оно правильно сгруппировано, отсортированно, хочешь по алфавиту, хочешь по назначению. И информация там самая актуальная.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

mshak
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 29.01.2008 (Вт) 14:17

Re: postmessage...

Сообщение mshak » 25.10.2009 (Вс) 14:34

их можно взять из API VIEWER (ставится вместе с VB) ... можно конечно вместо VBKeyF5 использовать
Public Const VK_F5 = &H74 'взято также из API Viewer
но правда не думаю что получится, они равны одинаковому значени.
аа FindWindow точно находит оперу?

------update
когда то давно, делал программу имитирующую нажатие левой кнопки мыши на заданном объекте.
когда запустишь, в верхнем текстовом поле выводиться caption объекта, нижнее соотвественно для фильтра.
Набери в нижнем Opera, у нее как минимум 2 окна получается.
Вложения
Clicker.rar
(12.13 Кб) Скачиваний: 66

Александр_ФФ
Обычный пользователь
Обычный пользователь
 
Сообщения: 93
Зарегистрирован: 23.11.2008 (Вс) 11:09
Откуда: Северодвинск

Re: postmessage...

Сообщение Александр_ФФ » 25.10.2009 (Вс) 15:02

mshak писал(а):их можно взять из API VIEWER (ставится вместе с VB) ... можно конечно вместо VBKeyF5 использовать
Public Const VK_F5 = &H74 'взято также из API Viewer
но правда не думаю что получится, они равны одинаковому значени.
аа FindWindow точно находит оперу?

------update
когда то давно, делал программу имитирующую нажатие левой кнопки мыши на заданном объекте.
когда запустишь, в верхнем текстовом поле выводиться caption объекта, нижнее соотвественно для фильтра.
Набери в нижнем Opera, у нее как минимум 2 окна получается.


Да, они в Apiviewer есть. уже отыскал, спс.
Оперу точно находит.
но так
Код: Выделить всё
Call SendMessage(h, WM_SETHOTKEY, vbKeyF5, 0)
тоже не идёт.

За прогу спасибо буду разбираться

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

Re: postmessage...

Сообщение Хакер » 25.10.2009 (Вс) 15:13

Автор, по почему ты думаешь, что окно оперы вообще как-то должно реагировать на те (корявые!) сообщения, которые ты ему шлёшь?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Александр_ФФ
Обычный пользователь
Обычный пользователь
 
Сообщения: 93
Зарегистрирован: 23.11.2008 (Вс) 11:09
Откуда: Северодвинск

Re: postmessage...

Сообщение Александр_ФФ » 25.10.2009 (Вс) 15:21

Потому что некорявые уже испробованы. Что смог найти по поиску, применял.
У вас есть решение?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: postmessage...

Сообщение iGrok » 25.10.2009 (Вс) 15:23

Хакер писал(а):
Api guide, Api viewer, заголовочные файлы от VC++. Гугль, в конце концов. )

Нет. Всё это неправильно. Правильный ответ: MSDN. Там оно правильно сгруппировано, отсортированно, хочешь по алфавиту, хочешь по назначению. И информация там самая актуальная.

Актуальная, да. Только далеко не для всех констант там прописаны значения. Да и те, что прописаны - прописаны не в статьях, а в комментах коммьюнити.

http://msdn.microsoft.com/en-us/library/ms646288.aspx Вот где мне его найти?
Его, впрочем, и в APIViewer'е нет. Нашёл только в гугле - в каком-то заголовочнике.
label:
cli
jmp label

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

Re: postmessage...

Сообщение Хакер » 25.10.2009 (Вс) 15:42

Так я не о значениях, а о самих константах. Значения --- это последнее дело.

Потому что некорявые уже испробованы. Что смог найти по поиску, применял.

Замечательная логика. Правильный код не сработал, авось неправильный сработает...
У вас есть решение?

Решение чего?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Александр_ФФ
Обычный пользователь
Обычный пользователь
 
Сообщения: 93
Зарегистрирован: 23.11.2008 (Вс) 11:09
Откуда: Северодвинск

Re: postmessage...

Сообщение Александр_ФФ » 25.10.2009 (Вс) 15:50

Если код не работает - значит, он не совсем правильный.
Мне просто окно Оперы обновить. Можно на кнопке "обновить" кликнуть, координаты известны, но имя неизвестно. Если уж с F5 никак.
Есть хоть ссылка на рабочий вариант?
Отправкой сообщений ранее не занимался.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: postmessage...

Сообщение iGrok » 25.10.2009 (Вс) 18:42

Хакер писал(а):Так я не о значениях, а о самих константах.

А. Тут согласен полностью.

По теме: Опере нажатия посылать бесполезно. У неё сплошь нестандартные контролы. Кнопка - это не окно, она просто нарисована.
Ну и не факт, что обработкой сообщений занимается именно главное окно..
label:
cli
jmp label

Александр_ФФ
Обычный пользователь
Обычный пользователь
 
Сообщения: 93
Зарегистрирован: 23.11.2008 (Вс) 11:09
Откуда: Северодвинск

Re: postmessage...

Сообщение Александр_ФФ » 25.10.2009 (Вс) 18:46

Понятно. Ладно, фиг с Оперой, как для ИЕ обновление окна сделать?

mshak
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 29.01.2008 (Вт) 14:17

Re: postmessage...

Сообщение mshak » 25.10.2009 (Вс) 19:04

можешь поискать окно с
caption: Элемент управления страницей
Class: ToolbarWindow32
это для IE8, в на этом элементе находятся две кнопки: обновить и стоп.
подсмортел при помощи spy++

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

Re: postmessage...

Сообщение Хакер » 25.10.2009 (Вс) 19:09

Для IE существует правильный метод: вызвать соотв. метод (Refresh, кажется) соответствующего объекта.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: postmessage...

Сообщение Денис » 25.10.2009 (Вс) 19:37

Я сейчас как админ выскажусь: Зачем слать Опере F5, если там для каждой страницы можно задать автообновление?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

След.

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

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

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

    TopList