![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Посылать сообщения приложению [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()