Сообщение 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-ый член прогрессии, записывать его в файл и передавать ответ первому приложению.
Итак, поехали (Гагарин).
С тем что нам нужно мы уже определились во введении, разрабатывать мы будем в Visual Studio 2008, так как она единственная лежала на сервере университета.
Создаем проект пустой проект Application A, а в нем создадим обертку для упрощенния создания окна (эта обертка понадобится и в другом проекте, а так же может понадобится Вам в будущем).
Хоть статья и для начинающих — на описании процесса создания окна мы останавливаться не будем, так как этой информации в интернете предостаточно.
Далее нам нужно в файл ресурсов добавить диалоговое окно:
Файлы ресурсов->Application A.rc -> Добавить ресурс->Dialog
Выглядеть это должно примерно так:
Приступим к кодингу.
Интересные и интересующие моменты рассмотрим отдельно
Тут мы объявляем структуру данных которую мы посылаем и необходимые структуры:
Далее идет проверка — запущено ли второе приложение, если нет то программа запускает его.
Далее упаковываем данные в нашу структуру
Правильно заполняем структуру передаваемых данных и отправляем её другому приложению:
Вот и все — не каких проверок на то заполнены ли поля и заполнены ли они корректно мы делать не будем в этой статье.
А теперь приступим к приложению B. Первые два файла — kWnd.h и kWnd.cpp остаются неизменными. Само приложение мы будем строить уже не на базе диалогового окна, а на базе чистого хардкора.
Здесь из интересных моментов стоит отметить прием данных в событии:
Далее к принятым данным можно достучаться например так:
Остальные приемы этого файла нам не интересны и скучны, далее там следует подсчет прогрессии и отправка тем же методом первому процессу.
И вот что у нас получилось:
Я очень надеюсь что моя статья была кому либо полезна и очень извиняюсь перед теми кому она не понравилась. Жду комментариев к коду (говнокоду).
Итак, приступим к созданию приложения, демонстрирующего работу WM_COPYDATA. Для создания хорошего примера потребуется создать два приложения. Первое будет отправлять данные (например, строку текста), другое приложение будет их получать. На главной форме первого приложения помещаем элемент управления TextBox, в который будет записываться передаваемая строка, и кнопку, нажатие которой инициирует передачу данных. Для второго приложения достаточно элемента для отображения текстовой информации типа Label. Перейдем к рассмотрению исходных текстов созданных приложений.
Рис. 1. Вид приложений посылки и получения строки
На форме находится кнопка отправки данных другому приложению, ее обработчик выглядит еледующим образом (листинг 1).
Листинг 1. Отправка данных другому приложению
Как и в случае первого приложения, нам необходима константа, которая будет идентифицировать тип операции:
3 ответа 3
В winapi вы можете обращаться к окнам из любого потока. Так что можно просто использовать SetWindowText или SendMessage .
Читайте также: