Если речь о работе с меню в чужом приложении, то можно так.
Чтобы программно вызвать команду из меню в чужом окне, ему посылается сообщение типа WM_COMMAND. В третьем параметре функции SendMessage (а именно, в младшем слове wParam) нужно указать идентификатор элемента выпадающего меню. Идентификатор можете получить с помощью функции GetMenuItemId. Только для этого необходимо знать позицию элемента меню (фактически порядковый номер начиная с 0).
Можно поиздеваться над Блокнотом для примера.
Вот так можно вызвать диалог выбора шрифта в Блокноте.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
NPadHandle: HWND; // handle главного окна Блокнота
NPadMenu, NPadSubMenu: HMENU; // дескрипторы главного и выпадающего меню
begin
NPadHandle := FindWindow(nil, PChar('Безымянный - Блокнот'));
NPadMenu := GetMenu(NPadHandle);
NPadSubMenu := GetSubMenu(NPadMenu, 2);
SendMessage(NPadHandle, WM_COMMAND, GetMenuItemId(NPadSubMenu, 1), 0);
end;
Поясню. Функция GetSubMenu возвращает дескриптор меню, соответствующего третьему (начиная с нуля) элементу главного меню. Это элемент "Формат" в Блокноте. При отправлении сообщения WM_COMMAND третий параметр — идентификатор второго (начиная с нуля) элемента в подменю "Формат". Получаю его с помощью функции GetMenuItemId. Если желаете, делайте это не при нажатии на кнопку, как в моем примере, а при нажатии клавиши пробел...
P.S. Вообще, думаю, вам следует еще посмотреть описание функции GetMenuItemInfo и про структуру MENUITEMINFO.