Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2008, 13:19   #1
AidarBik
Форумчанин
 
Регистрация: 12.06.2007
Сообщений: 130
По умолчанию PopupMenu должно появляться только при нажатии на значок в трее правой кнопкой

Как сделать так, чтобы всплывающее меню пояявлялось только при нажатии на значок в трее правой кнопкой. Пытался сделать так:
Код:
function MainWindowProc(pWnd: HWND; pMsg: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  Result:=0;
  case pMsg of
    ......
    WM_USER + 13: //Сообщение значка в трее
    begin
      GetCursorPos(CursorPos);
      if Msg.lParam = WM_RBUTTONUP then
        TrackPopupMenu(TrayMenu, TPM_RIGHTBUTTON, CursorPos.X, CursorPos.Y, 0, Wnd, nil);
    end;
    else
      Result:=DefWindowProc(pWnd, pMsg, wParam, lParam);
  end;
end;
Тогда меню не появляется совсем, если убрать строчку if Msg.lParam = WM_RBUTTONUP then тогда меню появляется как только подведу мышку к значку в трее. И мое меню не закрывается после того, как оно появилось.
AidarBik вне форума Ответить с цитированием
Старый 07.03.2008, 13:32   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

А вообще если потрасить?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.03.2008, 13:34   #3
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Судя по всему иконка уже помещена в трей и посылает событие WM_USER+13

Пишем обработчик события

Код:

const WM_ICONNOTIFY = WM_USER+13;

procedure WMIconNotify(var Message:TMessage); message WM_ICONNOTIFY;

procedure TFMain.WMIconNotify(var Message:TMessage);
var PT:TPoint;
begin
   case Message.lParam of
     WM_LBUTTONDBLCLK : {};
     WM_LBUTTONDOWN   : {};
     WM_RBUTTONDOWN :
        begin
           GetCursorPos(PT);
           PopupMenu1.Popup(PT.X, PT.Y);
        end;
   end;
   Message.Result := 0;
end;
alexBlack вне форума Ответить с цитированием
Старый 07.03.2008, 13:40   #4
AidarBik
Форумчанин
 
Регистрация: 12.06.2007
Сообщений: 130
По умолчанию

Приложение без формы.
Я когда точки останова поставил, оказалось что lParam все время равен 0.
AidarBik вне форума Ответить с цитированием
Старый 07.03.2008, 13:56   #5
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от AidarBik Посмотреть сообщение

if Msg.lParam = WM_RBUTTONUP then

[/code]
А что это за переменная ?. В параметрах просто lParam
alexBlack вне форума Ответить с цитированием
Старый 07.03.2008, 14:02   #6
AidarBik
Форумчанин
 
Регистрация: 12.06.2007
Сообщений: 130
По умолчанию

Действительно...Вот и ошибка... Но менб все равно не закрывается если оно теряет фокус. Что сделать?
AidarBik вне форума Ответить с цитированием
Старый 07.03.2008, 14:14   #7
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

После вызова PopUp нужно послать WM_NULL

Код:

   PopupMenu1.Popup(p.x, p.y);
   PostMessage(Handle, WM_NULL, 0, 0);
в твоем случае Handle - это pWnd
alexBlack вне форума Ответить с цитированием
Старый 07.03.2008, 19:47   #8
AidarBik
Форумчанин
 
Регистрация: 12.06.2007
Сообщений: 130
По умолчанию

Спасибо. Но только код работает если перед этим добавить SetForegroundWindow(pWnd);
У меня появился еще один вопрос, а как узнать, что на какой-то элемент меню нажали?
Создаю элементы так:
Код:
  AppendMenu(TrayMenu, MF_STRING or MF_CHECKED, 1, 'Запускать вместе с Windows');
  AppendMenu(TrayMenu, MF_STRING, 2, 'О программе..');
  AppendMenu(TrayMenu, MF_STRING, 3, 'Выход');
AidarBik вне форума Ответить с цитированием
Старый 08.03.2008, 08:18   #9
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

посмотри сообщение WM_MENUSELECT
rpy3uH вне форума Ответить с цитированием
Старый 08.03.2008, 09:31   #10
AidarBik
Форумчанин
 
Регистрация: 12.06.2007
Сообщений: 130
По умолчанию

А как его обрабатывать? Посмотрел в спраке, не понял.
AidarBik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PopupMenu левой кнопкой мыши Pinya Компоненты Delphi 3 22.08.2008 19:23
при открытии большого файла должно появляться окно с ProgressBar и показывать ход открытия Михаил Юрьевич Общие вопросы Delphi 3 28.05.2008 23:33
delphi дейтсвия над label при нажатии правой кнопки xbIm Помощь студентам 4 15.02.2008 18:08
Как работать с правой кнопкой мыши? ZeRRon Помощь студентам 4 28.12.2007 18:45
начал учить только-только - нужна ваша помошь vanDJ Помощь студентам 20 18.12.2007 21:53