Учись программированию на C++ Builder бесплатно!
Простая посылка сообщений

Построим простую программу, демонстрирующую посылку сообщений. Создаем новый проект и в нем две формы Form1 и Form2, сохраните проект, назвав модули форм U1Mess1 и U2Mess1 соответственно, а файл проекта PMess1. Форма Form1 будет главной и она будет управлять видимостью формы Form2. Поэтому в ее модуль необходимо включить директиву препроцессора:

#include "U2Messl.h"

а свойство Visible формы Form2 должно быть равно false.

Перенесите на форму Form1 две кнопки, дав им надписи «Show Form2» и «Close Form2». В обработчике щелчка первой кнопки напишите оператор:

Form2->Show();

а в обработчике щелчка второй кнопки оператор:

SendMessage(Form2->Handle, WM_CLOSE, 0, 0);

Этот оператор посылает сообщение WM_CLOSE (второй параметр функции SendMessage) форме Form2. Первый параметр функции SendMessage содержит дескриптор окна этой формы, полученный с помощью ее свойства Handle. Сообщение WM_CLOSE не имеет параметров поэтому параметры wParam и lParam заданы равными нулю.

Приведенный выше оператор можно заменить на следующий:

Form2->Perform(WM_CLQSE, 0, 0);

Результат будет тем же самым.

Сохраните и запустите приложение. При нажатии пользователем кнопки Show Form2 приводит к появлению на экране формы Form2, а нажатие кнопки Close Form2 к ее закрытию. Так что посылаемое формой Form1 сообщение достигает своего адресата.

Конечно, этот пример не очень интересный, поскольку сделать невидимой форму Form2 можно было бы и не посылая никаких сообщений Windows, а просто используя метод Hide.

Откройте новый проект, задайте заголовок Caption ее формы равным «Приложение Pmess2» (этот текст будет далее использовать для идентификации окна этого приложения) и сохраните проект под именем PMess2, а модуль формы под именем UlMess2. Откомпилируйте новый проект и сохраните. В дальнейшем мы еще к нему вернемся.

Теперь попробуем управлять этим проектом из формы Form1 проекта PMes1l. Откройте проект PMes1l и добавьте на форму Form1 две кнопки, сделав на них надписи «Exec Pmess2» и «Close Pmess2». В обработчике щелчка первой кнопки напишите оператор:

WinExec("Pmess2.ехе", SW_RESTORE);

который запускает приложение PMess2 на выполнение. А теперь закроем его. Для этого в обработчике щелчка кнопки Close Pmess2 напишите оператор:

SendMessage(FindWindow("TForm1","Приложение Pmess2"), WM_CLOSE, 0, 0);

Этот оператор использует функцию FindWindow для получения дескриптора окна приложения, которому надо послать сообщение, а затем функцией SendMessage посылает сообщение WM_CLOSE.

Сохраните и запустите приложение. Теперь, нажимая кнопку Exec Pmess2, можно выполнять приложение PMess2, причем можно создать несколько экземпляров этого приложения. А кнопкой Close Pmess2 можно закрывать приложение PMess2. Так получается возможность управлять из одного приложения другими. Но в данном случае был известен класс окна (TForm1) внешнего приложения. Поэтому была применена функция FindWindow, передав в нее и имя класса, и заголовок окна. А как быть, если нужно закрыть какое-то чужое приложение? Например, из своего приложения был выполнено стандартное приложение Windows «Калькулятор», пользователь посчитал, что ему было надо, а теперь нужно закрыть «Калькулятор», послав ему сообщение WM_CLOSE (например, пользователь уже не работает с ним, а закрыть забыл).

При посылке сообщения другому приложению возникает задача определить дескриптор нужного окна. Если было определено имя класса необходимого приложения (например, SdCalc для приложения «Калькулятор») с помощью WinSight 32 и необходимо послать из своего приложения сообщение о закрытии калькулятора, можно выполнить оператор: 

SendMessage(FindWindow("SciCalc","Калькулятор"), WM_CLOSE, 0, 0);

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

Поделиться