Форум: "WinAPI";
Текущий архив: 2003.06.02;
Скачать: [xml.tar.bz2];
ВнизСообщения Найти похожие ветки
← →
SammIk (2003-04-04 18:47) [0]Доброе время.
Мастера, в приложении "сервер" и "клиент" обьявляю константу
сообщения.
например:
const
wm_my:wm_user+200;
дальше из "клиента" отсылаю сообщение
sendMessage(HWND_BROADCAST,wm_my,0,0)
но в приложение "сервер" оно не попадает.
есественно обработчик в "сервер" я вставил.
← →
Suntechnic (2003-04-04 19:15) [1]>SammIk ©
Никто не может гарантировать что wm_user+200 для клиента и для сервера будет одним и тем же значением. Если клиент и сервер на одной и той же машине, то в таких случаях используют ф-цию RegisterWindowMessage и вызывают её и для клиента и для сервера.
← →
panov (2003-04-04 19:19) [2]PostMessage вместо SendMessage
← →
SammIk (2003-04-04 19:37) [3]
> Suntechnic
Это не сетевые приложения.
Иони на одном компе.
если я делаю так
procedure my(var mes:tmessage);message wm_my;
то wm_my может быть только константои.
Задам вопрос по другому.
Почему при отсылке бродкаст сообщения, я его не получаю?
← →
SammIk (2003-04-04 19:38) [4]
> panov
а в чем разница?
← →
Cobalt (2003-04-04 19:56) [5]LRESULT SendMessage(
HWND hWnd, // handle of destination window
UINT Msg, // message to send
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
Parameters
hWnd
Identifies the window whose window procedure will receive the message. If this parameter is HWND_BROADCAST, the message is sent to all top-level windows in the system, including disabled or invisible unowned windows, overlapped windows, and pop-up windows; but the message is not sent to child windows.
BOOL PostMessage(
HWND hWnd, // handle of destination window
UINT Msg, // message to post
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
Parameters
hWnd
Identifies the window whose window procedure is to receive the message. Two values have special meanings:
Value Meaning
HWND_BROADCAST The message is posted to all top-level windows in the system, including disabled or invisible unowned windows, overlapped windows, and pop-up windows. The message is not posted to child windows.
Действительно, интересно, в чем разница?
← →
panov (2003-04-04 20:18) [6]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 PostMessage function, in contrast, posts a message to a thread"s message queue and 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.
← →
Suntechnic (2003-04-04 20:45) [7]>panov ©
Это конечно чудно что вы разъяснили разницу между SendMessage и PostMessage, но откуда вы знаете что человеку надо? Надо ли ему отослать сообшение через очередь или напрямую? Но HWND_BROADCAST тут абсолютно ни при чём.
>SammIk ©
Во-первых сделай это через RegisterWindowMessage, а во-вторых проверь является ли твоё окно, которое получает сообщение, TOP level.
← →
panov (2003-04-04 21:01) [8]>Suntechnic
Да, это чудно, я согласен.
Но вот по этому поводу -
Никто не может гарантировать что wm_user+200 для клиента и для сервера будет одним и тем же значением.
не надо вводить людей в заблуждение.
wm_user+200 - это число. И для любой программы оно одинаково.
Другое дело, что в системе работают много программ и они тоже могут определить свои windows-сообщения.
RegisterWindowMessage используется исключительно для получения уникального номера сообщения и гарантии, что больше этот номер не захватит ни одна программа.
← →
Suntechnic (2003-04-04 21:08) [9]>panov ©
Никто не может гарантировать что wm_user+200 для клиента и для сервера будет одним и тем же значением.
не надо вводить людей в заблуждение.
wm_user+200 - это число. И для любой программы оно одинаково.
Да ну? А кто вам вообще сказал, что клиент и сервер будут компилироваться одним компилятором с использованием одних и тех же библиотек и что Microsoft в следующей версии библиотеки не изменит это значение? Так что не будьте таким самонадеянным.
← →
panov (2003-04-04 21:12) [10]Да ну? А кто вам вообще сказал, что клиент и сервер будут компилироваться одним компилятором с использованием одних и тех же библиотек...
А кто это сказал обратное?
Не надо передергивать.
Клиент и сервер компилируются одним компилятором и WM_USER в данный момент времени будет для клиентской и серверной программы одним и тем же.
Не надо ерничать.
← →
Suntechnic (2003-04-04 21:21) [11]>panov ©
Клиент и сервер компилируются одним компилятором и WM_USER в данный момент времени будет для клиентской и серверной программы одним и тем же.
При этом условии да, но кто сказал, что именно так и есть? (я вот только недавно писал программу где в подобной ситуации "сервером" выступала библиотека написанная на Delphi, а клиентом С#-кая assembly)... Во всех остальных случаях, как правило будет одинаковым, но гарантии никто не даст.
Вообщем надо заканчивать этот флейм. WM_USER + x для этих целей нельзя использовать по многим соображениям.
← →
Morfein (2003-04-04 21:28) [12]Зря спорите... да и не о том... для незнающих сообщаю: броадкастинг не работает для пользовательских сообщений!
← →
SammIk (2003-04-04 21:43) [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;
← →
SammIk (2003-04-04 21:44) [14]
> Morfein
А как тогда?
← →
nikkie (2003-04-04 21:46) [15]Удалено модератором
Примечание: OffTopic
← →
Suntechnic (2003-04-04 21:58) [16]>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 каждый раз когда попадаешь в цикл обработки сообщений. Достаточно это сделать один раз.
← →
SammIk (2003-04-04 22:01) [17]
> Suntechnic
Тут ты ошибаешься,
в case выбираемые значения только константы =>
wm_my := RegisterWindowMessage("MY_UNIQUE_MESSAGE");
.......
wm_my :beep(400,20);
НЕ КАТИТ((((
← →
nikkie (2003-04-04 22:05) [18]>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:08) [19]
> nikkie
Пробовать надо.
Спасибо всем, мои мысли поттвердились)
← →
Suntechnic (2003-04-04 22:17) [20]>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++. Но идея я думаю понятна.
← →
nikkie (2003-04-04 22:22) [21]это к тому, что
>Suntechnic © (04.04.03 21:58)
>>Morfein ©
>Да HWND_BROADCAST абсолютно параллельно чего отсылать. Это >сообщение это просто число, и не более того.
наврал ты немного :)
← →
Morfein (2003-04-04 22:40) [22]Да, тут я немного ошибся... но по форме был прав... просто левые самопальные константы система не даёт отправлять.
← →
Suntechnic (2003-04-05 00:38) [23]>nikkie ©
>наврал ты немного :)
Где я наврал? :) Ты что не чувствуешь разницу между should use и must use? Так что HWND_BROADCAST действительно переллельно чего отсылать...
← →
nikkie (2003-04-05 01:17) [24]чувствую... но попробуй сам. варианта два - либо эту доку индиец так писал, либо ее русские так прочитали... :))
ЗЫ система - 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 01:44) [25]>nikkie ©
Убедил :)
Скажем так: не всё равно, а почти всё равно :) Игнорируются сообщения диапазона WM_USER <-> 0xC000.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.06.02;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.008 c