![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перехватить нажатие пункта меню
L.N.N. © (2003-08-07 10:42:00)
Добрый день.
Есть программа для бухгалтерии. При отправке на печать документа, она создаёт отчет в Ворде. Отчет людей не устраивает, поэтому я хочу, чтобы когда пользователь нажимает на определённый пункт в менюшке, действие передалось моей программе. А вот в каком направлении работать я не знаю. Хэндл программы, меню, и подменю с пунктом печати, я нахожу. Но как узнать, что пункт был нажат?
L.N.N. (2003-08-08 10:31:00) [1]
Объясняю. Есть программа для бухгалтерии, которая хранит счета. Она при печати создаёт Вордовский документ, который и печатает. Но маркетингу отчет не нравится (нельзя передать по факсу), и изменить его нельзя, так как прогамма его создает с нуля. Поэтому я написал программу, которая создает удобный для всех отчет в Экселе, используя базу бухгалтерской программы. Но начальник хочет, чтобы я автоматизировал свою программу, чтобы народ просто нажимал кнопку печати в той программе, а печатала моя.
За пояснение спасибо. Будем разбираться.
Игорь Шевченко (2003-08-07 17:40:00) [2]
Все вроде проще - в hook передается структура, одним из полей которой является hwnd. Сравниваешь его с окном твоей программы, поле Message сравниваешь с WM_COMMAND, поле wParam - с тем самым идентификатором меню, который вызывает печать отчета. Но, IMHO, все это неверный в корне путь.
Программа для печати отчета ведь какие-то данные использует, правильно ? А их ты откуда брать собираешься ?
L.N.N. (2003-08-07 16:47:00) [3]
Прочитал. Только всё равно не понятно, как я фильтре определю нужное мне приложение, допустим зная его хэндл.
Игорь Шевченко (2003-08-07 15:25:00) [4]
> Если нетрудно, то можете указать материалы по хукам в интернете.
Раздел "Статьи" на этом сайте
L.N.N. (2003-08-07 15:20:00) [5]
Я пытаюсь делать следующим образом:
Так устанавливаю хук.
theHook := SetWindowsHookEx(WH_CALLWNDPROC, @TfmMain.CBTHookProc, hInstance, 0);
if theHook = 0 then messageBox(0,"Error!","Error!",mb_ok);
А так, насколько я понимаю, надо отфильтровывать только сообщения из необходимой программы. Всё правильно?
function TfmMain.CBTHookProc(Code: Integer; wParam: Longint;lParam:
Longint):Longint;
begin
Result := 0;
// А как реализовать проверку здесь?
Result := 1;
end;
Если нетрудно, то можете указать материалы по хукам в интернете.
Игорь Шевченко (2003-08-07 12:44:00) [6]
Если в чужом приложении - то хуком WH_CALLWNDPROC скорее всего
L.N.N. (2003-08-07 12:39:00) [7]
GetMessage? Или что-то другое. И каким образом ловить это сообщение? По таймеру? Можно немного поподробнее?
Заранее спасибо.
Игорь Шевченко (2003-08-07 11:31:00) [8]
Очевидно, обрабатывать сообщение WM_COMMAND, которое посылается главному (или неглавному :)) окну системы при клике на пункте меню.