Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.84
Xtir
11 / 11 / 0
Регистрация: 10.07.2010
Сообщений: 130
#1

Как послать своё сообщение другому приложению? - C++

05.07.2011, 22:14. Просмотров 2605. Ответов 10
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
#define WM_MYMESSAGE        2000
 
void main()
{
    HWND hWnd;
    hWnd = ::FindWindow(NULL,"MyApp");
 
    ::SendMessage(hWnd,WM_MYMESSAGE,0,0);
}
вот что-то типа такого, и в другом приложении (на базе диалога) обработать это сообщение, как это можно сделать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2011, 22:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как послать своё сообщение другому приложению? (C++):

Как послать сообщение по асе? - C++
мне необходимо в фоновом режиме послать сообщение по ICQ на определенный (заранее известный) UIN... ася уже загружена... хотя если можно...

Как послать сообщение WM_Какое-то иконке в трее ? - C++
ну там где часы, аська и прочие иконки - послать одной из них ? иконку я ставлю сам, всё о ней знаю но как ей послать сообщение из другой...

Послать сообщение exe-шнику и получить ответ - C++
Такая задача: есть exe-шник, скажем программа чат-бот. Запускается через командную строку и в командной строке же и работает. Пишешь фразу...

Послать сообщение окну в указанный момент времени - C++
Здравия желаю! Вот сижу, в носу ковыряюсь от скуки — задел извилину. Интересно стало: как можно без цикла проверки системного...

Каким аспектам программирования стоит посвятить своё внимание? Как правильно подойти к обучению? - C++
Здраствуйте, у меня накопилась парочка вопросов. Учу с++, дошел до классов. Цель- GameDev и разработка приложений в целом Учусь в 10...

Как послать запрос и прочитать по HTTP - C++
Хочу разобраться в этой теме и нужен пример работающий в GCC. Спасибо.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
05.07.2011, 22:17 #2
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
schdub
2946 / 1290 / 238
Регистрация: 19.01.2009
Сообщений: 3,385
Завершенные тесты: 1
05.07.2011, 22:21 #3
Цитата Сообщение от Xtir Посмотреть сообщение
#define WM_MYMESSAGE 2000
значение WM_MYMESSAGE должно быть в [WM_USER; 0x7FFF]
0 through WM_USER - 1 Messages reserved for use by Windows.
WM_USER through 0x7FFF Integer messages for use by private window classes.
0x8000 through 0xBFFF Messages reserved for future use by Windows.
0xC000 through 0xFFFF String messages for use by applications.
Greater than 0xFFFF Reserved by Windows for future use.
Xtir
11 / 11 / 0
Регистрация: 10.07.2010
Сообщений: 130
05.07.2011, 22:30  [ТС] #4
хм... но я так понимаю что отправляемое и получаемое сообщения должны быть идентичны? и если я обоим пропишу WM_USER+1, где гарантия что они будут одинаковы? или они всё же будут идентичны?

с хуками пока не разбирался, мб ещё будет что полегче, а то там шляпа какая-то
schdub
2946 / 1290 / 238
Регистрация: 19.01.2009
Сообщений: 3,385
Завершенные тесты: 1
05.07.2011, 22:43 #5
WM_USER - это константа.

Еще взгляните на функцию RegisterWindowMessage():
The RegisterWindowMessage function defines a new window message that is guaranteed to be unique throughout the system. The returned message value can be used when calling the SendMessage or PostMessage function.

C
1
2
3
UINT RegisterWindowMessage(
    LPCTSTR lpString    // address of message string
   );

Parameters

lpString

Points to a null-terminated string that specifies the message to be registered.



Return Values

If the message is successfully registered, the return value is a message identifier in the range 0xC000 through 0xFFFF.
If the function fails, the return value is zero.

Remarks

The RegisterWindowMessage function is typically used to register messages for communicating between two cooperating applications.
If two different applications register the same message string, the applications return the same message value. The message remains registered until the Windows session ends.
Only use RegisterWindowMessage when more than one application must process the same message. For sending private messages within a window class, an application can use any integer in the range WM_USER through 0x7FFF. (Messages in this range are private to a window class, not to an application. For example, predefined control classes such as BUTTON, EDIT, LISTBOX, and COMBOBOX may use values in this range.)

See Also

PostAppMessage, PostMessage, SendMessage
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
05.07.2011, 22:52 #6
Управление калькулятором из другой программы

Добавлено через 1 минуту
Имитация клавишь в другом окне
schdub
2946 / 1290 / 238
Регистрация: 19.01.2009
Сообщений: 3,385
Завершенные тесты: 1
05.07.2011, 23:14 #7
kravam, имхо здесь вопрос несколько в другом: как осуществить взаимодействие двух программ написанных ТС.

Еще если необходимо осуществить простое взаимодействие, то можно использовать WM_COPYDATA
Если посложнее, то можно использовать PIPE или даже сокеты.
Xtir
11 / 11 / 0
Регистрация: 10.07.2010
Сообщений: 130
05.07.2011, 23:25  [ТС] #8
хм, а вроде что-то получается, даже получилось (вроде) строку передать, вот тока строка почему-то приходит в виде каких-то символов

посылка сообщения:
C++
1
2
3
4
5
6
7
COPYDATASTRUCT cd;
char buffer[32];
strcpy(buffer,"1234");
cd.lpData = &buffer;
cd.cbData = sizeof(buffer);
 
::SendMessage(hWnd,WM_MYMESSAGE,0,(LPARAM)&cd);
получение сообщения:
C++
1
2
3
4
5
6
void CMyApp::OnMyMessage(CWnd* pWnd, COPYDATASTRUCT* pCD)
{
    char buffer[32];
    strcpy(buffer,(char*)pCD->lpData);
    MessageBox(buffer);
}
Добавлено через 9 минут
Цитата Сообщение от schdub Посмотреть сообщение
kravam, имхо здесь вопрос несколько в другом: как осуществить взаимодействие двух программ написанных ТС.

Еще если необходимо осуществить простое взаимодействие, то можно использовать WM_COPYDATA
Если посложнее, то можно использовать PIPE или даже сокеты.
не знаю насколько сложно реализовать то, что мне нужно, но надо сделать вот что:
допустим сначала программа должна отправить другой программе размер массива, та его запишет в свою некую переменную.
потом она будет посылать какие-то строки, другая в свою очередь должна по очереди их записывать в 2 массива.
на самом деле всё немного сложнее, но мне не хочется лишнего писать, что не имеет отношения к данному вопросу.

ну вот и мне не понятно, как сделать что бы программа, которая получает сообщения, могла их как-то "фильтровать", т.е. что бы при получении определённого сообщения, она выполняла определённое действие, поэтому я и решил посылать ей свои сообщения. И вот вроде бы получилось, да вот чё-та фигня вместо строки приходит
schdub
2946 / 1290 / 238
Регистрация: 19.01.2009
Сообщений: 3,385
Завершенные тесты: 1
05.07.2011, 23:32 #9
Xtir,
The data being passed must not contain pointers or other references to objects not accessible to the application receiving the data.

Добавлено через 6 минут
Цитата Сообщение от Xtir Посмотреть сообщение
могла их как-то "фильтровать"
обратите внимание на COPYDATASTRUCT::dwData - через этого мембера структуры, мы можем передавать, своего рода, код сообщения (Specifies up to 32 bits of data to be passed to the receiving application).
Xtir
11 / 11 / 0
Регистрация: 10.07.2010
Сообщений: 130
05.07.2011, 23:45  [ТС] #10
Цитата Сообщение от schdub Посмотреть сообщение
Xtir,
The data being passed must not contain pointers or other references to objects not accessible to the application receiving the data.

Добавлено через 6 минут

обратите внимание на COPYDATASTRUCT::dwData - через этого мембера структуры, мы можем передавать, своего рода, код сообщения (Specifies up to 32 bits of data to be passed to the receiving application).
во, по-моему то что надо спасибо )))
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
05.07.2011, 23:47 #11
Цитата Сообщение от Xtir Посмотреть сообщение
допустим сначала программа должна отправить другой программе размер массива, та его запишет в свою некую переменную.
потом она будет посылать какие-то строки, другая в свою очередь должна по очереди их записывать в 2 массива.
Я бы через файлы отправлял. Первая программа пишет файл, вторая его цилически читает. Так, первая закончила писать, вторая прочла, при необходимости удалила. И так далее.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2011, 23:47
Привет! Вот еще темы с ответами:

Как послать аналоговый звук в порт? - C++
Здравствуйте. Интересует вопрос как вывести звук в аналоговой форме. http://www.cyberforum.ru/audio-amplifier/thread1572652.html ...

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

Как подключить пользовательскую DLL к приложению - C++
Добрый вечер! Я первый раз пишу dll. Вот ее текст: My.cpp: #include<iostream> #include "My.h" using namespace std; namespace...

Как определить размер фаила с ifstream или как-то по другому? - C++
Как определить размер фаила с помощью ifstream или как-то по другому?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.07.2011, 23:47
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru