Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2008, 00:56   #1
Crazyman
Пользователь
 
Регистрация: 24.01.2008
Сообщений: 36
По умолчанию Как принять сообщение (SendMessage)

как можно принять сообщение, отправленное с помощью SendMessage.
Точнее мне надо передать Структуру типа _SystemTime и еще int64 все это по отдельности.
Пример SendMessage(hwnd,1000,0,integer(@st )); как мне это принят и обработать. А также как мне принять int64 ?
Crazyman вне форума Ответить с цитированием
Старый 19.02.2008, 01:38   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Во-первых, не советую использовать "1000" - сообщения меньше WM_USER (1024) зарезервированы либо для уже существующих сообщений, либо "для будущего использования". Во-вторых принимается это всё в оконной функции окна, если это дельфи, то это, если не ошибаюсь, TForm.WndProc, в дельфи же можно определить для класса формы процедуру-обработчик message для конкретного сообщения, смотрите документацию по "message". Передача данных любых размеров не представляет проблемы, например, в форме указателя, как Вы и делаете, но здесь требуются некоторые уточнения, как то: принадлежит ли окно тому же процессу (а в ряде случаев и потоку), что и вызывающий SendMessage и хранящий данные поток и еще ряд моментов.
B_N вне форума Ответить с цитированием
Старый 19.02.2008, 09:39   #3
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от Crazyman Посмотреть сообщение
как можно принять сообщение, отправленное с помощью SendMessage.
объявлении функции обработчика конкретных сообщений
Код:
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure proc1(var Msg:TMessage);message WM_USER;
  end;
Цитата:
Сообщение от Crazyman Посмотреть сообщение
Точнее мне надо передать Структуру типа _SystemTime и еще int64 все это по отдельности.
с int64 проблем не будет так как старшую часть можно поместить в LParam, а младшую в WParam. А в вот с _SystemTime не всё так просто так как она имеет размер 16 байт, придётся использовать WM_COPYDATA.
rpy3uH вне форума Ответить с цитированием
Старый 20.02.2008, 01:28   #4
Crazyman
Пользователь
 
Регистрация: 24.01.2008
Сообщений: 36
По умолчанию

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
объявлении функции обработчика конкретных сообщений
Код:
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure proc1(var Msg:TMessage);message WM_USER;
  end;

с int64 проблем не будет так как старшую часть можно поместить в LParam, а младшую в WParam. А в вот с _SystemTime не всё так просто так как она имеет размер 16 байт, придётся использовать WM_COPYDATA.

Мне надо саму процедуру принятия !!!! И. Подскажите, как мне отправить
int64 если я использую уже SendMessage(hwnd,$1100,$my number, и остается тока это пустое).
И все-таки как мне обработать прием, если я использую DlgProc ,а не TForm !!

Цитата:
Сообщение от B_N Посмотреть сообщение
Во-первых, не советую использовать "1000" - сообщения меньше WM_USER (1024) зарезервированы либо для уже существующих сообщений, либо "для будущего использования". Во-вторых принимается это всё в оконной функции окна, если это дельфи, то это, если не ошибаюсь, TForm.WndProc, в дельфи же можно определить для класса формы процедуру-обработчик message для конкретного сообщения, смотрите документацию по "message". Передача данных любых размеров не представляет проблемы, например, в форме указателя, как Вы и делаете, но здесь требуются некоторые уточнения, как то: принадлежит ли окно тому же процессу (а в ряде случаев и потоку), что и вызывающий SendMessage и хранящий данные поток и еще ряд моментов.
Send Mesage происходит в библиотеки этой программы. И все-таки как мне принять Int64 . Можно показать пример???

Последний раз редактировалось rpy3uH; 20.02.2008 в 18:16.
Crazyman вне форума Ответить с цитированием
Старый 20.02.2008, 04:42   #5
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

2 Crazyman

За Вас rpy3uH уже даже функцию объявил, Вам ее определить осталось. Поскольку не уверен, есть ли в Дельфи что-нибудь вроде LODWORD/HIDWORD, напишу так:

Код:
procedure proc1(var Msg:TMessage);
// Получить
var ReceivedLong64 : int64;
begin
	ReceivedLong64 := Msg.lParam;
	ReceivedLong64 := ReceivedLong64  shl 32;
	ReceivedLong64 := ReceivedLong64 + Msg.wParam;
end;
А если Вы в DlgProc сообщения ловите, то стоило привести кусочек, воизбежание разночтений.
Код:
function DlgProc(.....);
var ReceivedLong64 : int64;
begin
	case uMsg of
		WM_INITDIALOG: ............;
		.....................................
		WM_MYMESSAGE: begin
			ReceivedLong64 := lParam;
			ReceivedLong64 := ReceivedLong64  shl 32;
			ReceivedLong64 := ReceivedLong64 + wParam;	
		end;
	end;
end;
Код:
// Отправить
var MyInt64 : int64;
.............
SendMessage(hWnd, WM_MYMESSAGE, cardinal(MyInt64), cardinal(MyInt64 shr 32));
Можете через указатель отправить и не надо с потолка придумывать номера для сообщений, в Windows есть вполне четкая система: WM_USER + 1, WM_USER + 2 и т.д.
Из какой библиотеки и из какой программы что вызывается - ни о чем не говорит. Если отправляется/получается в разных процессах, то важно помнить, что у каждого своя независимая память и без принятия дополнительных мер процесс А не сможет прочитать что-нибудь по указателю из процесса Б в процессе Б.
B_N вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Параметры SendMessage Jenya Win Api 4 11.12.2010 19:15
Отправить , а потом принять пакет. casper123 Работа с сетью в Delphi 3 16.08.2008 02:56
Как принять GET запрос eldar Работа с сетью в Delphi 2 11.08.2008 00:19
SendMessage (перенесено со старого форума) rpy3uH Win Api 0 30.10.2006 20:19