Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Несколько вопросов по сообщениям в Windows. 
V
    Опции темы
AndreySol
Дата 20.1.2007, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 19.6.2004

Репутация: 1
Всего: 1



Вопрос 1.
Можно завести свое сообщение
Код

UINT msgMyMessage = RegisterWindowMessage((LPCTSTR) "WM_MY_SUPER_MESSAGE");

послать его
Код

::SendMessage(HWND_BROADCAST, msgMyMessage, (WPARAM)10, (LPARAM)10);

а затем к примеру в WindowProc его обработать
Код

if(message == msgMyMessage)
{
    CString strRes = "";
    strRes.Format("%u, %u", wParam, lParam);
    MessageBox(strRes, "",0);
}

Объясните какой смысл в указании строкового названия сообщения, ведь сделать if(message == WM_MY_SUPER_MESSAGE) не получится ? Вероятно надо как-то связать полученный идентификатор со строковым названием ?
Вопрос 2.
Если к примеру какое-то сообщение, допустим приведенное выше, будет посылаться 50000 раз в секунду, как это будет в плане нагрузки на систему ? И возможно ли вообще с такой частотой ?
PM MAIL   Вверх
Earnest
Дата 20.1.2007, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Если речь идет об относительно небольшом приложении, где все под контролем, смысла регистрировать сообщения нет никакого. Выдели себе пул чисел выше WM_USER и пользуйся. Или о локальных сообщениях внутри какого-либо класса.
На самом деле все сообщения в Windows - числовые. А строковые имена служат для обеспечения уникальности, причем глобальной:
Цитата

The RegisterWindowMessage function defines a new window message that is guaranteed to be unique throughout the system. 

И смысл они имееют только в RegisterWindowMessage. Реальным номером сообщения будет возвращенное число. И именно его ты должен использовать при ловле и обработке.

Смысл регистрации сообщений со строковыми именами в регулировании доступа из разных мест. Скажем, пишешь универсальную библиотеку контролов, и не можещь себе позволить выделить пул сообщений - иначе это может вызвать проблемы у приложений-пользователей библиотеки. А так - нарисовал себе несколько сообщений с длинными значащими именами, и получил для них числовые ид-ры, причем не факт что всегда одинаковые.

Или обмен сообщениями между приложениями: строковое сообщение можно зарегистрировать в нескольких приложениях. При этом ты получишь один и тот же ид-р сообщения.




--------------------
...
PM   Вверх
AndreySol
Дата 21.1.2007, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 19.6.2004

Репутация: 1
Всего: 1



Цитата

строковое сообщение можно зарегистрировать в нескольких приложениях. При этом ты получишь один и тот же ид-р сообщения.

А пример кода как сие сделать ?
Имеется в виду допустим завести в ресурсах строковый параметр, в StringTabe наверно, а затем как-то скормить его RegisterWindowMessage ?
И еще - "При этом ты получишь один и тот же ид-р сообщения" - Вы уверены в этом ? Может на это утверждение есть где-то в MSDN или SDK пояснение ?

Это сообщение отредактировал(а) AndreySol - 21.1.2007, 09:59
PM MAIL   Вверх
skyboy
Дата 21.1.2007, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



Цитата(AndreySol @  21.1.2007,  08:48 Найти цитируемый пост)
И еще - "При этом ты получишь один и тот же ид-р сообщения" - Вы уверены в этом ? 

приложение. на форму бросаешь кнопку button1.
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  public
   procedure defaultHandler(var Message); override;
  end;

var
  Form1: TForm1;
  MY_CLOSE_MESSAGE: cardinal;

implementation
{$R *.dfm}

procedure TForm1.defaultHandler(var Message);
begin
  if TMessage(Message).Msg =  MY_CLOSE_MESSAGE
   then
    Application.Terminate
   else
    inherited;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
SendMessage(HWND_BROADCAST,MY_CLOSE_MESSAGE,0,0);
end;

begin
MY_CLOSE_MESSAGE:= RegisterWindowMessage('This is message then close windows of my program only');
end.

сколько бы ты не запустил копий своего приложения, по нажатию на кнопку все(HWND_BROADCAST отсылает сообщения всем окнам системы - кто хочет, тот отработает) окна получают сообщение и убиваются. причем, в каждом окне registerwindowmessage вызывается отдельно, но с одинаковой строкой-описанием. 
Цитата(AndreySol @  21.1.2007,  08:48 Найти цитируемый пост)
Имеется в виду допустим завести в ресурсах строковый параметр, в StringTabe наверно, а затем как-то скормить его RegisterWindowMessage ?

А почему бы просто в коде сразу не задать? зачем сложности?
Цитата(AndreySol @  21.1.2007,  08:48 Найти цитируемый пост)
И еще - "При этом ты получишь один и тот же ид-р сообщения" - Вы уверены в этом ? Может на это утверждение есть где-то в MSDN или SDK пояснение ?

Сам бы и поискал ;)
по своему разумению, могу сказать, что механизм сообщений держит где-то ассоциативный список: код сообщения + описание; и когда ты хочешь зарегистрировать сообщение, сначала происходит поиск по этому списку: а нет ли там сообщения уже такого? если есть, вернется тебе уже существующий идентификатор; если нет - новый идентификатор сообщение и твоё описание будет добавлено в список. И это вполне логично, не находишь?

Добавлено @ 11:03 
Цитата(SDK)

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. 

PM MAIL   Вверх
AndreySol
Дата 22.1.2007, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 19.6.2004

Репутация: 1
Всего: 1



Спасибо за разъяснения,  все понятно.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0505 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.