![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
отловить нетсенд [D5, Win2k]
barby © (2004-01-27 09:49:00)ДОбрый день.
Как послать нет сенд - все понятно.
А как поймать нет сенд, посланный на мою машину?
Кто может подсказать?
GrayFace (2004-01-31 14:04:00) [1]real_dimedrol прав. Для этого есть компонеты. А можно хук поставить.
real_dimedrol (2004-01-30 16:30:00) [2]По-моему net send настолько неудобная штука, что лучше действительно написать своего клиента для отправки-получения сообщений да и не мучатся. Тем более что делается это достаточно просто.
YuRock (2004-01-28 16:32:00) [3]... В смысле, в его оконную процедуру приходит. А что?
YuRock (2004-01-28 16:32:00) [4]> Какое событие происходит при появлении нового окна?
Ему приходит сообщение WM_CREATE (или WM_INITDIALOG для диалогов)
barby (2004-01-28 16:29:00) [5]Какое событие происходит при появлении нового окна?
barby (2004-01-28 15:06:00) [6]2 maxx0
Это тоже не быстрый способ.
Нужно отловить сообщение Windows, возникающее при создании нового окна и если его класс и имя соответствует окну нетсенда, то прочитать его и закрыть.
Вот как это сделать, какой функцией, об этом я спрашиваю.
maxx0 (2004-01-28 10:41:00) [7]Пуск-Программы-Администрирование-Просмотр событий
Раздел "журнал системы"
Там регистрируются так же все пришедшие нет сендом сообщения.
Иструментарий для обращения к логам смотри от
OpenEventLog
ReadEventLog
YuRock (2004-01-28 10:09:00) [8]1. Можно на глаз;
2. Можно через поток;
3. Можно через хук;
4. Можно еще как-нибудь...
YuRock (2004-01-28 10:09:00) [9]1. Можно на глаз;
2. Можно через поток;
3. Можно через хук;
4. Можно еще как-нибудь...
barby (2004-01-28 08:56:00) [10]Еще один нюанс: как определить момент появление окна (нет сенд), какое сообшение ловить?
По таймеру не очень удобно.
barby (2004-01-27 16:15:00) [11]спасибо
YuRock (2004-01-27 14:41:00) [12]> barby (27.01.04 14:04) [10]
uses Windows, Dialogs;
var
hMessage, hStatic: HWND;
pBuf: Array[0..255] of Char;
begin
hMessage := FindWindow('#32770', 'Служба сообщений ');
if hMessage <> 0 then begin
hStatic := FindWindowEx(hMessage, 0, 'Static', nil);
if hStatic <> 0 then begin
GetWindowText(hStatic, @pBuf, 256);
ShowMessage(pBuf);
Exit;
end;
end;
ShowMessage('Ничего не найдено');
end.
Подробнее некуда
barby (2004-01-27 14:04:00) [13]Rouse_ ©
Спасибо, но лучше нет сенд не отключать.
2 YuRock ©
А поподробнее про функцию нахождения окна класса "Static" можно?
Rouse_ (2004-01-27 12:44:00) [14]Отключаешь службу сообщений и запускаешь эту прогу:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
Memo1: TMemo;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
MailSlot: THandle;
ErrStr: array [0..MAX_PATH] of Char;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
var
CurrentSize, Size, Count: DWORD;
Msg: String;
Err: LongBool;
I: Integer;
From, sTo: String;
begin
Count := 0;
Err := GetMailSlotInfo(MailSlot, nil, Size, @Count, nil);
if not Err then
begin
FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM,
nil,
GetLastError,
0,
@ErrStr[0],
MAX_PATH,
nil);
Memo1.Lines.Add('Can not GetMailSlotInfo: ' + String(ErrStr));
Exit;
end;
if Count > 0 then
begin
SetLength(Msg, Size);
ReadFile(MailSlot, Msg[1], Size, CurrentSize, nil);
I := 1;
while (Msg[I] #0) do Inc(I);
From := Copy(Msg, 1, I - 1);
Delete(Msg, 1, I);
I := 1;
while (Msg[I] #0) do Inc(I);
sTo := Copy(Msg, 1, I - 1);
Delete(Msg, 1, I);
OemToChar(PChar(From), PChar(From));
OemToChar(PChar(sTo), PChar(sTo));
OemToChar(PChar(Msg), PChar(Msg));
Memo1.Lines.Add('Ïîëó÷åíî ñîîáùåíèå îò: ' + From +
' äëÿ ' + sTo + #13#10 + Msg);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
MailSlot := CreateMailslot('\\.\mailslot\messngr', 0, MAILSLOT_WAIT_FOREVER, nil);
if MailSlot = INVALID_HANDLE_VALUE then
begin
FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM,
nil,
GetLastError,
0,
@ErrStr[0],
MAX_PATH,
nil);
Memo1.Lines.Add('Can not create mailslot: ' + String(ErrStr));
Exit;
end;
end;
end.
Только нужно учесть что при отключенной службе сообщений как net send так и NetMessageBufferSend перестанут работать, поэтому отправлять придется через CreateFile с флагом FILE_SHARE_READ на адрес "\\имя компьютера\mailslot\messngr\"
YuRock (2004-01-27 11:43:00) [15]1. Можно и по таймеру
2. Найти в найденном окне окно класса "Static"
(2004-01-27 11:37:00) [16]Удалено модератором
YuRock (2004-01-27 11:27:00) [17]Никакое. Надо это окно постоянно искать. И если найдено - закрывать!
(это только один из вариантов)
(2004-01-27 11:16:00) [18]Удалено модератором
(2004-01-27 11:11:00) [19]Удалено модератором
YuRock (2004-01-27 10:32:00) [20]Можно как и любое окно. Тем более, что это обычный MessageBox (диалог - #32770)