mmfData^.hHookWndProc := SetWindowsHookEx(WH_CALLWNDPROC, @HookWndProc, hInstance, TID);
function HookWndProc(Code: Integer; wParam: wParam; lParam: lParam): Integer;
stdcall;
var
cwp: PCWPSTRUCT;
begin
Result := CallNextHookEx(mmfData^.hHookWndProc, Code, wParam, lParam);
if Code >= 0
then
begin
cwp := PCWPSTRUCT(lParam);
case cwp.
message of
WM_INITMENU:
AddPopupItem(cwp.wParam);
end;
end;
end;
// - fügt dem PopupMenu mit Handle hPopup einen Eintrag "&Advanced" an zweiter Stelle ein
// - es handelt sich um das richtige PopupMenu, wenn die Anzahl der MenuItems = 8 und der Text des ersten MenuItems = "&Open" ist
procedure AddPopupItem(hPopup: Cardinal);
var
mii: TMENUITEMINFO;
s:
string;
len: Integer;
begin
if GetMenuItemCount(hPopup) = 8
then
begin
len := GetMenuString(hPopup, 0,
nil, 0, MF_BYPOSITION);
if (len > 0)
then
begin
SetLength(s, len + 1);
GetMenuString(hPopup, 0, PChar(s), len + 1, MF_BYPOSITION);
if Pos('
&Open', s) > 0
then
begin
s := '
&Advanced';
ZeroMemory(@mii, sizeof(TMENUITEMINFO));
mii.cbSize := sizeof(TMENUITEMINFO);
mii.fMask := MIIM_TYPE;
mii.dwTypeData := PChar(s);
mii.cch := Length(s);
InsertMenuItem(hPopup, 1, true, mii);
end;
end;
end;
end;