hook(true); // Устанавливаем наш перехватчик событий Windows
p:=GetMenu(h); // Верхнее меню
// Меняем название пункта в верхнем меню "Справка"
ModifyMenu(p, 2, MF_BYPOSITION, GetMenuItemID(p,2), '-TSN-' );
pp:= GetSubMenu(p,2); // Подпункты в верхнем меню (с нуля отсчет)
// Меняем название подпункта в подменю "Справка -> О программе"
ModifyMenu(pp, 2, MF_BYPOSITION, GetMenuItemID(pp,2) , 'About Sergius …' );
// Добавляем новый элемент подменю с идентификатором IDM_TSN
AppendMenu(pp, MF_STRING ,IDM_TSN, 'А это новый пункт !');
DrawMenuBar(h); // Прорисовываем модифицированное меню
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
{ при закрытии формы – освобождаем Hook }
var h: HWND;
begin
hook(false); // Деактивизируем наш перехватчик событий Windows
h:=FindWindow('SciCalc',nil);
h:=FindWindow('SciCalc',nil); if h<>0 then Postmessage(h,WM_QUIT,0,0);
end;
end.
library HOOK_DLL_TSN;
uses Windows, Messages, SysUtils;
var SysHook: HHook = 0; Wnd: Hwnd = 0;
const IDM_TSN=$C0;
function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;forward;
{Процедура установки HOOK-а}
procedure hook(switch : Boolean) export; stdcall;
begin
if switch=true then
// Устанавливаем хук на сообщения после их обработки в приложении
// Наша процедура захвата называется "SysHook", в данном модуле
SysHook := SetWindowsHookEx(WH_GETMESSAGE, @SysMsgProc, HInstance, 0)
else UnhookWindowsHookEx(SysHook);
end;
function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
{ Обработчик перехвата }
label 1;
var dc: HDC; h, h2: HWND; x: cardinal; ss: string;
begin
{ Если нам не стоит обрабатывать это событие, то и не надо,
передадим упраление следующиму хуку }
if (code<0) or (code<>HC_ACTION) then goto 1;
// Ищем калькулятор, если он не запущен, но отдыхаем …
h:=FindWindow('SciCalc',nil); if h=0 then goto 1;
h2:=GetWindow(h,GW_CHILD); // Нашли окно отображения (табло) у кальулятора
// Если калькулятор не виден, то ничего не надо …
if not IsWindowVisible(h) then goto 1;
// Получаем указатель на текущее обрабатываемое окно, ждем калькулятор
Wnd:=TMsg(Pointer(lParam)^).hwnd;
// Механизм нашей прорисовки на калькуляторе для любого окна