Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сообщения


Страницы:   1 2

SammIk ©   (2003-04-04 18:47:00) 

Доброе время.
Мастера, в приложении "сервер" и "клиент" обьявляю константу
сообщения.
например:
const
wm_my:wm_user+200;
дальше из "клиента" отсылаю сообщение
sendMessage(HWND_BROADCAST,wm_my,0,0)
но в приложение "сервер" оно не попадает.

есественно обработчик в "сервер" я вставил.


Suntechnic   (2003-04-05 01:44:00) [1]

>nikkie ©
Убедил :)
Скажем так: не всё равно, а почти всё равно :) Игнорируются сообщения диапазона WM_USER <-> 0xC000.


nikkie   (2003-04-05 01:17:00) [2]

чувствую... но попробуй сам. варианта два - либо эту доку индиец так писал, либо ее русские так прочитали... :))

ЗЫ система - win2000

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
protected
procedure WndProc(var Message: TMessage); override;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

const
WM_XXX = WM_USER + 1;
var
WM_YYY: Cardinal;

procedure TForm1.FormCreate(Sender: TObject);
begin
WM_YYY := RegisterWindowMessage("Suntechnic ne prav");
end;

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

procedure TForm1.Button2Click(Sender: TObject);
begin
SendMessage(HWND_BROADCAST, WM_YYY, 0, 0);
end;

procedure TForm1.WndProc(var Message: TMessage);
begin
if Message.Msg = WM_XXX then
MessageBox(0, "WM_XXX", "", MB_OK);
if Message.Msg = WM_YYY then
MessageBox(0, "WM_YYY", "", MB_OK);
inherited;
end;


Suntechnic   (2003-04-05 00:38:00) [3]

>nikkie ©
>наврал ты немного :)
Где я наврал? :) Ты что не чувствуешь разницу между should useи must use? Так что HWND_BROADCAST действительно переллельно чего отсылать...


Morfein   (2003-04-04 22:40:00) [4]

Да, тут я немного ошибся... но по форме был прав... просто левые самопальные константы система не даёт отправлять.


nikkie   (2003-04-04 22:22:00) [5]

это к тому, что
>Suntechnic © (04.04.03 21:58)
>>Morfein ©
>Да HWND_BROADCAST абсолютно параллельно чего отсылать. Это >сообщение это просто число, и не более того.
наврал ты немного :)


Suntechnic   (2003-04-04 22:17:00) [6]

>nikkie © (04.04.03 22:05)

>Suntechnic
Applications that need to communicate using HWND_BROADCAST should use the RegisterWindowMessage function to obtain a unique message for inter-application communication.


Это к чему? Я по-моему об этом с начала ветки только и говорю.

>SammIk ©
Если там с синтаксисом чего-то не так уж не взыщи. Мой основной язык C++. Но идея я думаю понятна.


SammIk   (2003-04-04 22:08:00) [7]


> nikkie

Пробовать надо.
Спасибо всем, мои мысли поттвердились)


nikkie   (2003-04-04 22:05:00) [8]

>Suntechnic
Applications that need to communicate using HWND_BROADCAST should use the RegisterWindowMessage function to obtain a unique message for inter-application communication.

>SammIk
в switch нельзя значит надо в if поставить


SammIk   (2003-04-04 22:01:00) [9]


> Suntechnic

Тут ты ошибаешься,
в case выбираемые значения только константы =>

wm_my := RegisterWindowMessage("MY_UNIQUE_MESSAGE");
.......
wm_my :beep(400,20);
НЕ КАТИТ((((


Suntechnic   (2003-04-04 21:58:00) [10]

>Morfein ©
Да HWND_BROADCAST абсолютно параллельно чего отсылать. Это сообщение это просто число, и не более того.

Обьясни что значит TOP lеvel?
если лавное окно процесса, то да.

Считай что это так.

Посылаешь сообщение
PostMessage(HWND_BROADCAST, RegisterWindowMessage("MY_UNIQUE_MESSAGE"),0,0);
Принимаешь:

function WindowProc(wnd:HWND; Msg : Integer; Wparam:Wparam; Lparam:Lparam):Lresult;
stdcall;
var wm_my : uint;
Begin
wm_my := RegisterWindowMessage("MY_UNIQUE_MESSAGE");
{Далее происходит цикл обработки сообщений}
case msg of
wm_destroy : //Сообщение посылаемое при уничтожении окна
Begin
postquitmessage(0); exit;
Result:=0;
End;
wm_my :beep(400,20);
else Result:=DefWindowProc(wnd,msg,wparam,lparam);
end;
End;


Только всё это, естественно, прооптимизировать надо. Нет необходимости вызывать RegisterWindowMessage каждый раз когда попадаешь в цикл обработки сообщений. Достаточно это сделать один раз.


nikkie   (2003-04-04 21:46:00) [11]

Удалено модератором
Примечание: OffTopic


SammIk   (2003-04-04 21:44:00) [12]


> Morfein

А как тогда?


SammIk   (2003-04-04 21:43:00) [13]


> Suntechnic

Обьясни что значит TOP livel?
если лавное окно процесса, то да.
А пост ли это, или сенд - ни фига не принивает;

C клиентом понятно
RegisterMess... и т.д.
А с сервером касяк(

Это обработчик

function WindowProc(wnd:HWND; Msg : Integer; Wparam:Wparam; Lparam:Lparam):Lresult;
stdcall;

Begin
{Далее происходит цикл обработки сообщений}
case msg of
wm_destroy : //Сообщение посылаемое при уничтожении окна
Begin
postquitmessage(0); exit;
Result:=0;
End;
(*
Сесь не катит переменная
поэтому wm_my:=Regis... тоже не катит.
Но можно if поставить.
И тоже не катит(((
*)
wm_my:beep(400,20);
else Result:=DefWindowProc(wnd,msg,wparam,lparam);
end;
End;


Morfein   (2003-04-04 21:28:00) [14]

Зря спорите... да и не о том... для незнающих сообщаю: броадкастинг не работаетдля пользовательских сообщений!


Suntechnic   (2003-04-04 21:21:00) [15]

>panov ©
Клиент и сервер компилируются одним компилятором и WM_USER в данный момент времени будет для клиентской и серверной программы одним и тем же.

При этом условии да, но кто сказал, что именно так и есть? (я вот только недавно писал программу где в подобной ситуации "сервером" выступала библиотека написанная на Delphi, а клиентом С#-кая assembly)... Во всех остальных случаях, как правило будет одинаковым, но гарантии никто не даст.

Вообщем надо заканчивать этот флейм. WM_USER + x для этих целей нельзя использовать по многим соображениям.


panov   (2003-04-04 21:12:00) [16]

Да ну? А кто вам вообще сказал, что клиент и сервер будут компилироваться одним компилятором с использованием одних и тех же библиотек...

А кто это сказал обратное?
Не надо передергивать.

Клиент и сервер компилируются одним компилятором и WM_USER в данный момент времени будет для клиентской и серверной программы одним и тем же.
Не надо ерничать.


Suntechnic   (2003-04-04 21:08:00) [17]

>panov ©
Никто не может гарантировать что wm_user+200 для клиента и для сервера будет одним и тем же значением.

не надо вводить людей в заблуждение.
wm_user+200 - это число. И для любой программы оно одинаково.


Да ну? А кто вам вообще сказал, что клиент и сервер будут компилироваться одним компилятором с использованием одних и тех же библиотек и что Microsoft в следующей версии библиотеки не изменит это значение? Так что не будьте таким самонадеянным.


panov   (2003-04-04 21:01:00) [18]

>Suntechnic

Да, это чудно, я согласен.

Но вот по этому поводу -
Никто не может гарантировать что wm_user+200 для клиента и для сервера будет одним и тем же значением.

не надо вводить людей в заблуждение.

wm_user+200- это число. И для любой программы оно одинаково.

Другое дело, что в системе работают много программ и они тоже могут определить свои windows-сообщения.

RegisterWindowMessageиспользуется исключительно для получения уникального номера сообщения и гарантии, что больше этот номер не захватит ни одна программа.


Suntechnic   (2003-04-04 20:45:00) [19]

>panov ©
Это конечно чудно что вы разъяснили разницу между SendMessage и PostMessage, но откуда вы знаете что человеку надо? Надо ли ему отослать сообшение через очередь или напрямую? Но HWND_BROADCAST тут абсолютно ни при чём.

>SammIk ©
Во-первых сделай это через RegisterWindowMessage, а во-вторых проверь является ли твоё окно, которое получает сообщение, TOP level.


panov   (2003-04-04 20:18:00) [20]

The SendMessage function sends the specified message to a window or windows. The function calls the window procedure for the specified window and does not return until the window procedure has processed the message. The PostMessagefunction, in contrast, posts a message to a thread"s message queueand returns immediately.

...

The PostMessage function places (posts) a message in the message queue associated with the thread that created the specified window and then returns without waiting for the thread to process the message. Messages in a message queue are retrieved by calls to the GetMessage or PeekMessage function.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо