Форум: "Начинающим";
Текущий архив: 2007.03.04;
Скачать: [xml.tar.bz2];
Вниз
Посылать сообщения приложению Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.042 c