Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Посылать сообщения приложению [D7, 95/98, 2000]


Trible ©   (2007-02-15 13:07:00) 

Hello all,
Как сделать, чтобы сторонняя программа могла посылать сообщения моему приложению? (именно приложению, не главному окну).

Цикл обработки Application.OnMessage сделал, из другой программы использую связку FindWindow + SendMessage. Но по ходу возникла одна проблема: заголовок моего приложения может изменяться от версии к версии, а класс окна всегда TApplication, и таких окон может быть несколько в системе, как обратиться именно к "моему" окну приложения?


Trible   (2007-02-15 15:57:00) [1]


> Ну а в целом интерпроцессное взаимодействие правильней организовывать
> на базе именованых программных каналов, а не на базе механизма
> сообщений.Имей это ввиду)

Наверное, это и правильней, но у меня очень простой проект и чем проще здесь будет механизм взаимодействия - тем лучше. Уже сделал, все получилось (через сообщения, видоизмененный метод DiamondShark-а). Если буду писать что-то посложнее, там уже будут именованные пайпы :) Еще раз спасибо за совет.


Сергей М.   (2007-02-15 15:39:00) [2]


> Trible   (15.02.07 14:57) [7]


Ну а в целом интерпроцессное взаимодействие правильней организовывать на базе именованых программных каналов, а не на базе механизма сообщений.

Имей это ввиду)


Trible   (2007-02-15 14:57:00) [3]

Буду пробовать.
Спасибо, Сергей М. и DiamondShark, за помощь.


Сергей М.   (2007-02-15 14:15:00) [4]


> очень уж много возни с установкой свойства


Да ладно, какая там возня !

При старте своего приложения создаешь/получаешь уникальноименованый глоб.атом и передаешь его на вход SetProp для гл.окна приложения.

Чужое приложение ищет этот атом, и, если он существует, ищет окно, обладающее св-вом, соответствующим найденному атому. Если окно найдено, то оно и есть искомое окно, вне зависимости от имени его класса и подписи


Trible   (2007-02-15 13:41:00) [5]


> > как обратиться именно к "моему" окну приложения?Создать
> именно "своё" окно.Взяв, к примеру, за основу Forms.AllocateHWnd:
>

не совсем понял механизм.
хотелось бы теперь пример, как использовать.


Trible   (2007-02-15 13:32:00) [6]


> Сергей М. ©   (15.02.07 13:18) [1]
> см. ф-ции Get/SetProp()

Это вариант, но очень уж много возни с установкой свойства, а потом поиском всех окон класса TApplication и проверкой определенного свойства у каждого.


Trible   (2007-02-15 13:29:00) [7]

А можно ли runtime поменять класс окна моего приложения (например, был TApplication, стал TMyApp_Class), и посылать сообщения окну с этим классом? Можно ли это как-нибудь сделать, и не нарушится ли при этом механизм работы Делфи-приложения? Очень уж заманчиво было бы ...


DiamondShark   (2007-02-15 13:29:00) [8]


> как обратиться именно к "моему" окну приложения?

Создать именно "своё" окно.
Взяв, к примеру, за основу Forms.AllocateHWnd:


var
 JustMyWindowClass: TWndClass = (
   style: 0;
   lpfnWndProc: @DefWindowProc;
   cbClsExtra: 0;
   cbWndExtra: 0;
   hInstance: 0;
   hIcon: 0;
   hCursor: 0;
   hbrBackground: 0;
   lpszMenuName: nil;
   lpszClassName: 'JustMyWindow_5193E5D7_7896_4579_93D0_F696102CDCA2');

function AllocateJustMyHWnd(Method: TWndMethod): HWND;
var
 TempClass: TWndClass;
 ClassRegistered: Boolean;
begin
 JustMyWindowClass.hInstance := HInstance;
 ClassRegistered := GetClassInfo(HInstance, JustMyWindowClass.lpszClassName,
   TempClass);
 if not ClassRegistered or (TempClass.lpfnWndProc <> @DefWindowProc) then
 begin
   if ClassRegistered then
     Windows.UnregisterClass(JustMyWindowClass.lpszClassName, HInstance);
   Windows.RegisterClass(JustMyWindowClass);
 end;
 Result := CreateWindowEx(WS_EX_TOOLWINDOW, JustMyWindowClass.lpszClassName,
   '', WS_POPUP {!0}, 0, 0, 0, 0, 0, 0, HInstance, nil);
 if Assigned(Method) then
   SetWindowLong(Result, GWL_WNDPROC, Longint(MakeObjectInstance(Method)));
end;

procedure DeallocateHWnd(Wnd: HWND);
var
 Instance: Pointer;
begin
 Instance := Pointer(GetWindowLong(Wnd, GWL_WNDPROC));
 DestroyWindow(Wnd);
 if Instance <> @DefWindowProc then FreeObjectInstance(Instance);
end;


Сергей М.   (2007-02-15 13:18:00) [9]

см. ф-ции Get/SetProp()


Наверх

Титульная страница Поиск, карта сайта Написать письмо