Сообщение winapi используемое для передачи данных между приложениями

Обновлено: 30.06.2024

Взаимодействие, как форма общения

В своей повседневной жизни, мы постоянно общаемся. Общение может подразумевать разговор, совместную работу и еще много всего прочего, однако в любом случае это обмен разного рода информацией, выраженной различными формами взаимодействия. Так же происходит и в электронном мире, когда мы запускаем какую-нибудь программу, не важно игра это, текстовый редактор, или среда разработки Delphi. Программы, начинают, скрыто от нас общаться и обмениваться информацией, в простейшем виде это обмен информацией между операционной системой и приложением.

Приложение может взаимодействовать, как со своими дочерними формами, так и с "посторонними" (внешними) приложениями. Виды взаимодействия с внешними приложениями могут быть следующими:

fActive = LOWORD(wParam); Флаг активации
fMinimized = (BOOL) HIWORD(wParam); Флаг минимизации (1 - если окно минимизировано, 0 - если нет)
hwndPrevious = (HWND) lParam; Идентификатор окна (Handle)

Параметр fActive показывает, как активизируется или деактивируется окно. Возможные значения этого параметра:

WA_ACTIVE окно активизируется не щелчком мыши (например, функцией SetActiveWindow или клавиатурой)
WA_CLICKACTIVE окно активизируется щелчком мыши
WA_INACTIVE окно деактивируется

WM_GETMINMAXINFO - посылается при изменении размеров или положения окна. Обработчик события может использоваться для ограничения допустимых размеров и координат положения на экране.

WM_GETMINMAXINFO
lpmmi = (LPMINMAXINFO) lParam; // address of structure

Параметр lpmmi указывает на структуру типа MINMAXINFO, содержащую принятые по умолчанию пределы изменения размеров и координат положения окна. Описание этой структуры:

typedef struct tagMINMAXINFO < // mmi
POINT ptReserved;
POINT ptMaxSize;
POINT ptMaxPosition;
POINT ptMinTrackSize;
POINT ptMaxTrackSize;
> MINMAXINFO;

Поля структуры означают следующее:

ptReserved Зарезервировано и пока не используется
ptMaxSize Поле типа Point определяет ширину (Point.x) и высоту (Point.y) развернутого окна
ptMaxPosition Поле типа Point определяет положение левого (Point.x) и верхнего (Point.y) краев развернутого окна
ptMinTrackSize Поле типа Point определяет минимальную ширину (Point.x) и минимальную высоту (Point.y) окна при изменении пользователем размеров его рамки.
ptMaxTrackSize Поле типа Point определяет максимальную ширину (Point.x) и максимальную высоту (Point.y) окна при изменении пользователем размеров его рамки.

WM_COPYDATA - посылается, когда одно приложение передает данные другому приложению.
Определение:
WM_COPYDATA

wParam = (WPARAM) (HWND) hwnd; Дескриптор посылающего окна
lParam = (LPARAM) (PCOPYDATASTRUCT) pcds; указатель на структуру с данными

Параметр hwnd идентифицирует окно, посылающее данные.
Параметр pcds указывает на структуру типа COPYDATASTRUCT, содержащую пересылаемые данные. Описание этой структуры:

typedef struct tagCOPYDATASTRUCT

< cds DWORD dwData; до 32 бит данных, передаваемых приложению-получателю
DWORD cbData; определяет размер (в байтах) даных, на которые указывает lpData
PVOID lpData; указатель на данные, передаваемые приложению-получателю
> COPYDATASTRUCT;

Объявление функции:
function SendMessage(HWND: hWnd, Msg,WPARAM: word,LPARAM: longint):longint;

function PostMessage(HWND: hWnd, Msg,WPARAM: word,LPARAM: longint):longint;

SendMessage (Form2.Handle, WM_CLOSE, 0, 0);

В данной строке ясно видно, что мы работаем с дочерним окном своего приложения (Form2.Handle) и передаем ему "приказ" закрыться (WM_CLOSE).

var
CDS : TCopyDataStruct;
dt : TDateTime;
ms : TMemoryStatus;
begin
.
GlobalMemoryStatus(ms);
CDS.dwData:=ms.dwAvailPageFile+ms.dwAvailPhys;
CDS.cbData:=SizeOf(dt);
CDS.lpData:=@dt;
SendMessage(FindWindow (`TForm1`, `Form1`), WM_COPYDATA, 0, longint(@CDS));
.
end;

procedure (var : ); message ;

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
private
< Private declarations >
procedure WMClose(var a : TWMClose) ;message WM_CLOSE;
.
implementation

.
procedure TForm2.WMClose( var a:TWMClose);
begin
if MessageDlgPos(`Меня хотят закрыть. Согласны?`, mtConfirmation, [mbYes,mbNo],0,BoundsRect.Left,BoundsRect.Bottom)=mrYes then Close
else Label1.Caption:=`Не закроюсь!`;
end;

Const
WM_MyMess1=WM_USER;
WM_MyMess2=WM_USER+1;

Сейчас в интернетах можно встретить много Hello World'ов на WinApi, но когда новичок спрашивает как в этот Hello World добавить пару нужных функций — закидывают тухлыми яблоками и тут же отправляют в пресловутый и могучий MSDN.

В этой статье от новичка новичкам я расскажу, как построить два простых приложения которые будут взаимодействовать друг с другом — одно будет принимать на вход параметры геометрической прогрессии и передавать её второму, второе же приложение будет рассчитывать n-ый член прогрессии, записывать его в файл и передавать ответ первому приложению.

image



Итак, поехали (Гагарин).

С тем что нам нужно мы уже определились во введении, разрабатывать мы будем в Visual Studio 2008, так как она единственная лежала на сервере университета.

Создаем проект пустой проект Application A, а в нем создадим обертку для упрощенния создания окна (эта обертка понадобится и в другом проекте, а так же может понадобится Вам в будущем).

Хоть статья и для начинающих — на описании процесса создания окна мы останавливаться не будем, так как этой информации в интернете предостаточно.

Далее нам нужно в файл ресурсов добавить диалоговое окно:

Файлы ресурсов->Application A.rc -> Добавить ресурс->Dialog

Выглядеть это должно примерно так:

image

Приступим к кодингу.

Интересные и интересующие моменты рассмотрим отдельно

Тут мы объявляем структуру данных которую мы посылаем и необходимые структуры:


Далее идет проверка — запущено ли второе приложение, если нет то программа запускает его.


Далее упаковываем данные в нашу структуру


Правильно заполняем структуру передаваемых данных и отправляем её другому приложению:


Вот и все — не каких проверок на то заполнены ли поля и заполнены ли они корректно мы делать не будем в этой статье.

А теперь приступим к приложению B. Первые два файла — kWnd.h и kWnd.cpp остаются неизменными. Само приложение мы будем строить уже не на базе диалогового окна, а на базе чистого хардкора.

Здесь из интересных моментов стоит отметить прием данных в событии:

Далее к принятым данным можно достучаться например так:


Остальные приемы этого файла нам не интересны и скучны, далее там следует подсчет прогрессии и отправка тем же методом первому процессу.

И вот что у нас получилось:

image

image

Я очень надеюсь что моя статья была кому либо полезна и очень извиняюсь перед теми кому она не понравилась. Жду комментариев к коду (говнокоду).

Итак, приступим к созданию приложения, демонстрирующего работу WM_COPYDATA. Для создания хорошего примера потребуется создать два приложения. Первое будет отправлять данные (например, строку текста), другое приложение будет их получать. На главной форме первого приложения помещаем элемент управления TextBox, в который будет записываться передаваемая строка, и кнопку, нажатие которой инициирует передачу данных. Для второго приложения достаточно элемента для отображения текстовой информации типа Label. Перейдем к рассмотрению исходных текстов созданных приложений.

Рис. 1. Вид приложений посылки и получения строки

На форме находится кнопка отправки данных другому приложению, ее обработчик выглядит еледующим образом (листинг 1).

Листинг 1. Отправка данных другому приложению

Как и в случае первого приложения, нам необходима константа, которая будет идентифицировать тип операции:



3 ответа 3



В winapi вы можете обращаться к окнам из любого потока. Так что можно просто использовать SetWindowText или SendMessage .


Читайте также: