Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Не срабатывает нажатие мыши!


Автор: shatalinalex 16.10.2006, 14:51
Здраствуйте!

Я взял примеры из DRKB (Delphi Russian Knowledge Base) , по добавлению иконки в трей, т.е когда приложение сворачивается появляется иконка в трее, по правому клику появляется PopUpMenu а по левому она должна восстановиться, но не восстанавливается пишу вот так!
Код

Procedure TForm1.Ic(n:Integer;Icon:TIcon);
  Var Nim:TNotifyIconData;
begin
     With Nim do
     Begin
          cbSize:=SizeOf(Nim);
          Wnd:=Form1.Handle;
          uID:=1;
          uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
          hicon:=Icon.Handle;
          uCallbackMessage:=wm_user+1;
          szTip:='опа на ';
    End;
    Case n OF  
      1: Shell_NotifyIcon(Nim_Add,@Nim);
      2: Shell_NotifyIcon(Nim_Delete,@Nim);
      3: Shell_NotifyIcon(Nim_Modify,@Nim);
    End;
end;

procedure TForm1.ControlWindow(var Msg: TMessage);
begin
    if Msg.WParam = SC_MINIMIZE then
      begin
        Ic(1, Application.Icon); // Добавляем значок в трей
        ShowWindow(Handle, SW_HIDE); // Скрываем программу
      end
    else
      inherited;
end;

procedure TForm1.IconMouse(var Msg: TMessage);
var p: tpoint;
begin
      GetCursorPos(p); // Запоминаем координаты курсора мыши
      case Msg.LParam of // Проверяем какая кнопка была нажата
        WM_LBUTTONUP, WM_LBUTTONDBLCLK: {Действия, выполняемый по одинарному или двойному щелчку левой кнопки мыши на зна?ке. В нашем случае это просто активация приложения}
          begin
            Ic(3, Application.Icon); // Удаляем зна?ок из трея
            ShowWindow(Application.Handle, SW_SHOWNORMAL); // Восстанавливаем окно программы
          end;
        WM_RBUTTONUP: {Действия, выполняемый по одинарному щелчку правой кнопки мыши}
          begin
            SetForegroundWindow(Handle); // Восстанавливаем программу в ка?естве переднего окна
            PopupMenu1.Popup(p.X, p.Y); // Заставляем всплыть тот самый TPopUp о котором я говорил чуть раньше
            PostMessage(Handle, WM_NULL, 0, 0) // Обнуляем сообщение
          end;
      end;
    end;

Автор: Romikgy 16.10.2006, 15:01
Цитата(shatalinalex @  16.10.2006,  13:51 Найти цитируемый пост)
ShowWindow(Application.Handle, SW_SHOWNORMAL); // Восстанавливаем окно программы

имхо лучше так    
Код

ShowWindow(Application.Handle, SW_SHOWNORMAL); 
ShowWindow(Handle, SW_RESTORE);
SetForegroundWindow(Handle);

Автор: shatalinalex 16.10.2006, 15:08
Все равно не получается  smile 

Думал может событие не правильно сделал - попробовал вот так 

Код

procedure TForm1.N3Click(Sender: TObject);
begin
  Ic(3, Application.Icon); // Удаляем зна?ок из трея
  ShowWindow(Application.Handle, SW_RESTORE); // Восстанавливаем окно программы
end;

procedure TForm1.N4Click(Sender: TObject);
begin
  close;
end;
Тоже не пашет! Ничего не понимаю!

Автор: Snowy 16.10.2006, 15:27
Полный код покажи.

Автор: shatalinalex 16.10.2006, 15:46
ОК кода много я линку кидаю воть http://www.shatalinalex.5gigs.com/progi/Unit1.pas

Автор: _hunter 16.10.2006, 15:56
а сообщение хоть приходит/ловится?
если в обработчике бряку поставить -- сто будет?

Автор: shatalinalex 17.10.2006, 09:27
Код


procedure TForm1.IconMouse(var Msg: TMessage);
var p: tpoint;
begin
      GetCursorPos(p);
      case Msg.LParam of WM_LBUTTONUP:
          begin
            showmessage('sdfsdf');
            Ic(3, Application.Icon);
            ShowWindow(Application.Handle, SW_RESTORE);
          end;
        WM_RBUTTONUP:
         begin
            SetForegroundWindow(Handle);
            PopupMenu1.Popup(p.X, p.Y);
            PostMessage(Handle, WM_NULL, 0, 0)
          end;
        WM_LBUTTONDBLCLK:
          begin
            Ic(3, Application.Icon);
            ShowWindow(Application.Handle, SW_RESTORE); 
          end;
      end;
end;



Он попадает в case ! выводит тестовое сообщение! А как проверить передается сообщение или нет!?!?

Автор: Демо 17.10.2006, 09:45
Вот 100%-работающий пример.
Сравни со своим кодом...

Код

unit ufIconTray;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Menus,
  ShellApi,dialogs;

var
  WM_MyNotifyIcon: Cardinal;

type

  TfIconTray = class(TForm)

    //PopUp-меню, всплывающее при клике на иконку
    pmIconTray: TPopupMenu;

    //Пункты меню
    pmIconTrayRestore: TMenuItem;       //Восстановление приложения
    pmIconTrayExit: TMenuItem;          //Завершение программы
    pmIconTrayNoAction: TMenuItem;      //Фиктивный пункт меню

    procedure FormCreate(Sender: TObject);
    procedure IconTray(aAction: Cardinal);    //Процедура для манипуляций с иконкой в SysTray
    procedure pmIconTrayRestoreClick(Sender: TObject);
    procedure pmIconTrayExitClick(Sender: TObject);
    procedure MyWndProc(var Message: TMessage);
    procedure FormShow(Sender: TObject); 
  end;

var
  fIconTray: TfIconTray;

implementation

{$R *.dfm}

procedure TfIconTray.FormCreate(Sender: TObject);
var
  UniqueStr: String;
begin
  Application.Title := Self.Caption;
  UniqueStr := Application.Title+IntToStr(Application.Handle);
//Получаем уникальный номер Windows-сообщения.
  WM_MyNotifyIcon := RegisterWindowMessage(PChar(UniqueStr));
//Заменяем обработчик стандартный обработчик сообщений на наш
  WindowProc := MyWndProc;
//  Application.OnMinimize :=  AppOnMinimize;
end;

procedure TfIconTray.MyWndProc(var Message: TMessage);
var
  P: TPoint;
begin
  //Обработка сообщения от иконки в SysTray
  if Message.Msg = WM_MyNotifyIcon then
  begin
    case Message.LParam of

      WM_LBUTTONDBLCLK :
        begin
          //Восстанавливаем приложение
          ShowWindow(Application.Handle,SW_RESTORE);
          //Восстанавливаем основную форму
          ShowWindow(Application.MainForm.Handle,SW_RESTORE);
          //Приложение - на передний план
          SetForegroundWindow(Application.MainForm.Handle);
          //Удаляем иконку
          IconTray(NIM_DELETE);
        end;
      //Клик на правой кнопке мыши
      WM_RBUTTONUP:
      begin
        //Считываем позицию курсора на экране
        GetCursorPos(P);
        //Показываем меню в позиции курсора
        SetForegroundWindow(Application.MainForm.Handle);
        pmIconTray.Popup(P.X, P.Y);
      end;
    end;
    //Заканчиваем обработку
    Message.Result := 0;
    Exit;
  end;
  //Обработка нажатия на кнопку свернуть в заголовке окна

  if (Message.Msg=WM_SYSCOMMAND) and
     (Message.wParam = SC_MINIMIZE) then
  begin
    //Добавляем иконку
    IconTray(NIM_ADD);
    //Скрываем основную форму
    ShowWindow(Application.MainForm.Handle,SW_HIDE);
    //Скрываем приложение
    ShowWindow(Application.Handle,SW_HIDE);
    //Заканчиваем обработку
    Message.Result := 0;
    Exit;
  end;
  //Не наше сообщение - вызываем стандартную процедуру окна
  WndProc(Message);
end;

//Процедура для манипуляций с иконкой
procedure TfIconTray.IconTray(aAction: Cardinal);
var
  nid: TNotifyIconData;
begin
//Заполнение структуры
  nid.cbSize := SizeOf(TNotifyIconData);    //Размер структуры
  nid.Wnd := Self.Handle;                   //Окно назначения
  nid.uID := 0;                             //Назначаем идентификатор иконке
  nid.uCallBackMessage := WM_MyNotifyIcon;  //Процедура для обработки сообщений
  nid.hIcon := Application.Icon.Handle;     //Это основная иконка приложения
  StrPCopy(nid.szTip,Application.Title);    //Всплывающая подсказка (Hint)
//Признаки:
//  NIF_ICON    - используется поле nid.hIcon
//  NIF_MESSAGE - используется сообщение с номером nid.uCallBackMessage для обработки
//  NIF_TIP     - для иконки назначен Hint - всплывающая подсказка.
  nid.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
  case aAction of
    NIM_ADD:  Shell_NotifyIcon(NIM_ADD, @nid);        //Добавление иконки
    NIM_DELETE:  Shell_NotifyIcon(NIM_DELETE, @nid);  //Удаление иконки
    NIM_MODIFY:  Shell_NotifyIcon(NIM_MODIFY, @nid);  //Модификация иконки
  end;
end;

//Обработка при выборе пункта меню "Восстановить"
procedure TfIconTray.pmIconTrayRestoreClick(Sender: TObject);
begin
//Посылаем нашему окну сообщение WM_LBUTTONDBLCLK
  PostMessage(Application.MainForm.Handle,WM_MyNotifyIcon,0,WM_LBUTTONDBLCLK);
end;

//Обработка при выборе пункта меню "Выход из программы"
procedure TfIconTray.pmIconTrayExitClick(Sender: TObject);
begin
//Посылаем нашему окну сообщение WM_LBUTTONDBLCLK
  PostMessage(Application.MainForm.Handle,WM_MyNotifyIcon,0,WM_LBUTTONDBLCLK);
//Закрываем приложение
  Application.MainForm.CLose;
end;

procedure TfIconTray.FormShow(Sender: TObject);
begin
  if not Boolean(Tag) then
  begin
    Form2.Show;
    Tag := 1;
  end;
end;

end.


Автор: shatalinalex 18.10.2006, 10:45
Демо, спасибо разобрался! Заработало ! Всем кто помогал в этой теме тоже огромное спасиба!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)