![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сообщения
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.