Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Отправка сообщений


Автор: Teran 16.9.2005, 13:09
Задача такая:

Я хочу оправить другому окну строку текста и в зависимости от строки другое окно по своиму реагировало.
Пользуюсь SendMessage
какое сообщение нужно отрправлять и куда втавлять текст который хочу отправить.

Автор: Rennigth 16.9.2005, 13:13
можешь посылать указатель на твою строку

Автор: Snowy 16.9.2005, 14:56
WM_COPYDATA

Автор: Snowy 16.9.2005, 15:10
Примерно вот так:
Код

var
  cd: TCopyDataStruct;
  s:  PChar;
  wnd: HWND;
begin
  wnd:=FindWindow(nil, 'The Window');
  s:='Дорогое окно, шлю тебе эту строку с наилучшими пожеланиями';
  cd.dwData:=2048;
  cd.cbData:=Length(s);
  cd.lpData:=@s;
  SendMessage(wnd,WM_COPYDATA, 0 ,dword(@cd));
end;

В cd.dwData можешь записать любое число. Оно для того, чтобы легче было ориентироваться и классифицировать данные.
В cd.cdData - кол-во передаваемых байт
В cd.lpData - указатель на сами данные. Может вообще отсутствовать (=0), если хочешь передать только dwData.

Автор: Dimannn 16.9.2005, 16:16
Можно вместо TCopyDataStruct отправлять
Код

Var p: PAnsiChar;

GetMem(p,1000);
p:='Hello, my dear window.';
SendMessage(wnd,WM_USER+1111, 0 ,dword(p));

Автор: Snowy 16.9.2005, 16:25
Если процессы разные, то нельзя.
Винда тебе просто не даст доступ к памяти другого процесса.
Для этого WM_COPYDATA и существует.
Винда создает проецируемый в памяти файл, копирует туда данные, дает приложению ссылку на него. Потом его убивает. Все автоматом, без лишних заморочек и нарушения доступа.
Добавлено @ 16:33
Вот фрагмент из Рихтера - глава "Передача данных через сообщения":
Цитата
Что ж, все хорошо, пока Вы посылаете сообщения, известные системе. А если мы определим собственное сообщение (WM_USER + x), собираясь отправить его окну другого процесса? Система не "поймет", что нам нужна общая проекция файла для корректировки указателей при их пересылке. Но выход есть — это сообщение WM_COPYDATA:
Код

COPYDATASTRUCT cds; 

SendMessage(hwndReceiver, WM_COPYDATA,
    (WPARAM) hwndSender, (LPARAM) &cds); 

COPYDATASTRUCT — структура, определенная в WinUser.h:

typedef struct tagCOPYDATASTRUCT { 
    ULONG_PTR dwData;
    DWORD cbData;
    PVOID lpData; 
} COPYDATASTRUCT;

Чтобы переслать данные окну другого процесса, нужно сначала инициализировать эту структуру. Элемент dwData резервируется для использования в Вашей программе. В него разрешается записывать любое значение. Например, передавая в другой процесс данные, в этом элементе можно указывать тип данных.
Элемент cbData задает число байтов, пересылаемых в другой процесс, а lpData указывает на первый байт данных. Адрес, идентифицируемый элементом lpData, находится, конечно же, в адресном пространстве отправителя.
Увидев, что Вы посылаете сообщение WM_COPYDATA, SendMessage создает проекцию файла размером cbData байтов и копирует данные из адресного пространства Вашей программы в эту проекцию. Затем отправляет сообщение окну-приемнику. При обработке этого сообщения принимающей оконной процедурой параметр lParam указывает на структуру COPYDATASTRUCT, которая находится в адресном пространстве процесса-приемника. Элемент lpData этой структуры указывает на проекцию файла в адресном пространстве процесса-приемника.
Сообщение WM_COPYDATA — мощный инструмент, позволяющий разработчикам экономить массу времени при решении проблем связи между процессами. И очень жаль, что применяется оно нечасто.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)