русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Отправка и получение сообщений

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

От До Значение
WM_USER-1 Зарезервированы Windows
WM_USER Пользовательские
Зарезервированы для будущих версий Windows
Текстовые сообщения

Здесь WM_USER – это константа, определенная в модуле Windows. Для своих сообщений удобно описать константу вида

CONST my_message=WM_USER+100;

Добавляемое число выбирается произвольно из диапазона 1..32767.

Программа-отправитель должна найти ссылку на окно программы-получателя. Поиск ведется по тексту в заголовке окна (то есть по содержимому свойства Caption главной формы). Вот как это делается:

var h:thandle;

begin

h:=FindWindow(nil, 'Form1');

Тип данных Thandle соответствует ссылке на окно (это целое число – системный номер окна). Функция FindWindow выполняет поиск окна по тексту в его заголовке (в рассматриваемом случае ‘Form1’). Первый параметр используется при поиске окна по типу данных (классу) и для поиска по заголовку устанавливается в NIL.

Если ссылка на окно не равна нулю, то окно найдено, и ему можно послать сообщение:

if h<>0 then

postmessage(h,my_message,0,0)

Здесь h – ссылка на окно программы-получателя, my_message – константа-номер сообщения, последние два нулевых параметра – дополнительные данные (две целочисленные переменные типа Longint), передаваемые вместе с сообщением.

Зарезервированные Windows сообщения представлены соответствующими константами. Их также можно использовать в пользовательских программах. Например, сообщение WM_CLOSE закрывает указанное приложение (именно оно посылается операционной системе окну программы при щелчке по крестику в правом верхнем углу окна или нажатии Alt+F4). Следующий код позволяет из программы на Delphi закрыть редактор Microsoft Word (при условии, что в нем не открыты никакие документы и заголовок его окна имеет вид "Документ1 - Microsoft Word'").

var h:thandle;

begin

h:=FindWindow(nil,'Документ1 - Microsoft Word');

if h<>0 then

PostMessage(h,WM_CLOSE,0,0)

end;

А как быть, если в Word открыт какой-то файл? Его название отображается в заголовке окна и оно нам неизвестно. Значит, и окно мы не найдем? Найдем! Ведь мы точно знаем, что в заголовке будет присутствовать текстовая строка "Microsoft Word". Значит, надо перебрать все окна и искать в заголовке каждого окна эту текстовую строку. Следующая функция именно это и делает. Ей на вход надо подать искомую текстовую строку и ссылку на собственное окно программы – с него начнется перебор окон.

function FindNextWnd(StartHWND: HWND; AString : String): HWND;

var

Buffer : array [0..255] of char;

s:STRING;

i:BYTE;

begin

FillChar(Buffer,256,#0);

Result := StartHWND;

repeat

Result := FindWindowEx(0, Result, nil, nil);

GetWindowText(Result, Buffer, SizeOf(Buffer));

i:=0;

s:='';

WHILE (i<=255) AND (buffer[i]<>#0) DO

BEGIN

s:=s+buffer[i];

INC(i)

END;

IF s<>'' THEN

if Pos(ANSIUpperCase(AString),ANSIUpperCase(s))<>0 then

Break;

until (Result = 0);

end;

Вызывается такая функция примерно следующим образом:

VAR h:HWND; r:INTEGER;

CONST MSW='Microsoft Word';

BEGIN

h:=FindNextWnd(Self.Handle,MSW);

IF h<>0 THEN

PostMessage(h,WM_CLOSE,0,0)

END;

Примененный здесь тип данных HWND эквивалентен типу THandle.

Теперь научимся принимать сообщения. Во-первых, в принимающей программе нужно описать точно такую же константу my_message. Описание одной и той же константы в двух разных проектах – дело не только некрасивое, но и потенциально опасное. Поэтому крайне желательно подобные «межпроектные» константы описывать в специальных файлах, которые затем могут подключаться к нескольким проектам. Такие файлы называются include-файлами и традиционно имеют расширение .inc. Внутри include-файла пишется фрагмент текста программы. Далее текст, содержащийся в include-файле, помещается в то место текста программы директива компилятора {$I имя include-файла}. Рассмотрим пример. Пусть на диске имеются папки Project1, Project2, Common (Рис. 21.7).

Рис. 25.7. Структура папок и файлов при использовании include-файлов.

В папке Common хранится текстовый файл const.inc, содержащий текст:

CONST

my_message=WM_USER+100;

В файлах проекта (main.pas) в том месте, где по синтаксису языка возможно употребление оператора CONST, следует написать:

unit main;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ComCtrls;

{$i ..\common\const.inc}

При этом путь к файлу можно не брать в кавычки, если он не содержит пробелов. Таким образом, перед компиляцией в файл main.pas вместо строчки

{$i ..\common\const.inc}

будут вставлены строки

CONST

my_message=WM_USER+100;

Подобный прием (вынесение части текста программы в отдельный файл) широко используется в языке С. Следует заметить, что применение include-файлов никак не сокращает размер результирующего exe-файла, оптимизации здесь не происходит, так как все равно фрагменты исходного текста компилируются в обоих проектах.

Для получения сообщения необходимо создать обработчик события «получение сообщения №N». Удобнее всего создать такой обработчик как метод объекта-главной формы приложения:

type

TForm1 = class(TForm)

private

{ Private declarations }

public

procedure aaa(var msg:tmessage); message my_message;

{ Public declarations }

end;

procedure tform1.aaa(var msg:tmessage);

begin

MessageDlg(‘Получено сообщение!’,mtInformation, [mbOK],0)

end;

Ключевое слово message в описании заголовка обработчика указывает на то, что он должен автоматически вызываться при поступлении сообщения с номером my_message. Обработчик получает на вход переменную msg типа Tmessage. Данный тип представляет собой запись с вариантами следующей структуры:

type

TMessage =record

Msg: Cardinal; { номер сообщения }

caseIntegerof

0: (

WParam: Longint;

LParam: Longint;

Result: Longint);

1: (

WParamLo: Word;

WParamHi: Word;

LParamLo: Word;

LParamHi: Word;

ResultLo: Word;

ResultHi: Word);

end;

Проще говоря, поля WParam и LParam содержат те самые дополнительные параметры, которые можно указывать в процедуре PostMessage(ссылка_на_окно,номер_сообщения,WParam,LParam. Если нужно рассматривать передаваемые параметры не как тип данных Longint, а как отдельные байты, то можно использовать поля WParamLo, WParamHi и LParamLo, LParamHi типа Word.

Просмотров: 598


Вернуться в оглавление



Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.