Показать сообщение отдельно
  #3  
Старый 22.04.2009, 15:27
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Если речь о работе с меню в чужом приложении, то можно так.
Чтобы программно вызвать команду из меню в чужом окне, ему посылается сообщение типа 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.
Ответить с цитированием