Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.04;
Скачать: CL | DM;

Вниз

Посылать сообщения приложению   Найти похожие ветки 

 
Trible   (2007-02-15 13:07) [0]

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

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


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

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


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

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


 
DiamondShark ©   (2007-02-15 13:29) [3]


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

Создать именно "своё" окно.
Взяв, к примеру, за основу 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;


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


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

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


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


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

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


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


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


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

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

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


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

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


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


> Trible   (15.02.07 14:57) [7]


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

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


 
Trible   (2007-02-15 15:57) [9]


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

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



Страницы: 1 вся ветка

Текущий архив: 2007.03.04;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.028 c
2-1171619292
Astronom
2007-02-16 12:48
2007.03.04
DirectoryListBox


4-1161622457
spyrytus
2006-10-23 20:54
2007.03.04
Как управлять чужим окном


2-1171294166
well
2007-02-12 18:29
2007.03.04
Excel. Работа с рисунком.


3-1165411941
ergoist
2006-12-06 16:32
2007.03.04
Обновление записи


1-1168528339
Wahnsinng
2007-01-11 18:12
2007.03.04
WebBrowser