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


Автор: h2o 21.10.2005, 13:14
разными способами добавлял иконку в трей - как описано в "Delphi: WinAPI и системное программирование" и через компонент!

BaloonHint не отображается в XP SP2! ТОЛЬКО... издаётся звук шлепка... и (если стоит галка "автоматически скрывать панель задач"), панель появляется на указанное время...
Я не пробовал это делать в Xp или Xp SP1, но в Longhorn (Vista beta 1) всё работает!!!!!!!!!!!!!

балун вызываю так.... через компонент FWTRAYICON
FWTrayIcon1.ShowBalloonHint('Hello World', 'Уведомление', TFWBalloonHintStyle(bhsInfo), 10);
всё стандартно!

пробовал не черезкомпонент. создал иконку как описанно в "Delphi: WinAPI и системное программирование". Нашёл где-то описание структуры, или класса или функции... или всё вместе, и влепил в прогу...
вызов был ShowBalloonHint('Hello World', 'Уведомление', TFWBalloonHintStyle(bhsInfo), 10);
где ShowBalloonHint кажись была функция!

ситуация та же - BaloonHint не отображается в XP SP2! ТОЛЬКО... издаётся звук шлепка... и (если стоит галка "автоматически скрывать панель задач"), панель появляется на указанное время...
Я не пробовал это делать в Xp или Xp SP1, но в Longhorn (Vista beta 1) всё работает!!!!!!!!!!!!!

я разозлился и всё потер.... но! это мне нужно! может знает кто как написать этот долбаный балун хинт иконки в трее, чтобы он показывался как надо в системах класса NT, тоесть...
windows: 2000(sp1,sp2,sp2,sp4), xp (sp1,sp2), windows 200 server (all sp), windows 2003 server (all sp), windows Vista!

может у кого уже готовый пример есть?


Добавлено @ 13:16
у меня Д7, не в этом ли дело?

Автор: Greblin 21.10.2005, 20:15
Попробуй компонент из RxLib. У меня подсказка нормально всплывает

Автор: Stolzen 22.10.2005, 12:34
Я пользуюсь компонентом CoolTrayIcon. Там все для этого есть. Если не найдешь, пиши - пришлю

Автор: Poseidon 22.10.2005, 14:25
Попробуй через WinApi создавать иконку и показывать от нее сообщение. Подробнее можешь прочитать тут: http://vingrad.ru/DELPHI-SYSTEM-002915

Вот, прикрепил тебе unit с основными функциями что бы было легче разбираться.

Автор: Albinos_x 23.10.2005, 16:29
компанентом не пользуюсь, делаю ручками...работает нормально... здесь даже где-то пример был...воспользуйся поиском....

Автор: Poseidon 23.10.2005, 19:49
Цитата(Albinos_x @ 23.10.2005, 16:29)
здесь даже где-то пример был...воспользуйся поиском....
Ничем не нужно пользоватся. Ты видать имеешь ввиде http://forum.vingrad.ru/index.php?showtopic=55210&view=findpost&p=438659мою статью. Я уже давал выше на нее ссылку. Так вот почитать её конечно стоит, для понимания. А вот воспользоваться ИМХО лучше тем юнитом, каторый я прикрепил выше. Там все сделано на основе той статьи. С русским описанием. Что не понятно, в РМ.

Автор: Alex 24.10.2005, 01:00
М
 
Albinos_x, спасибо за ответы, но немножко по четче давайте их пожалуйста. Если говорите, что пишите сами, то примерчик совсем не лишним был бы как вы это делаете

Автор: Albinos_x 24.10.2005, 06:02
Цитата
Albinos_x, спасибо за ответы, но немножко по четче давайте их пожалуйста. Если говорите, что пишите сами, то примерчик совсем не лишним был бы как вы это делаете


Код

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Menus, ShellAPI;

const MyTrayIcon = WM_USER+1;
type
 TForm1 = class(TForm)
   PopupMenu1: TPopupMenu;
   ...
 private
   { Private declarations }
   procedure MTIcon(var a: TMessage); message MyTrayIcon;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

 type
TTimeoutOrVersion = record
case Integer of
0: (uTimeout: UINT);
1: (uVersion: UINT);
end;
TNotifyIconDataEx = record
cbSize: DWORD;
hWnd: HWND;
uID: UINT;
uFlags: UINT;
uCallbackMessage: UINT;
hIcon: HICON;
szTip: array[0..127] of AnsiChar; 
dwState: DWORD;
dwStateMask: DWORD;
szInfo: array[0..255] of AnsiChar;
TimeoutOrVersion: UINT; 
szInfoTitle: array[0..63] of AnsiChar;
dwInfoFlags: DWORD;
guidItem: TGUID;
end;

       TBalloonTimeout = 10..30{seconds};
       TBalloonIconType = (bitNone,    // нет иконки 
                     bitInfo,    // информационная иконка (синяя) 
                     bitWarning, // иконка восклицания (жёлтая) 
                     bitError);  // иконка ошибки (краснаа) 



const
   NIIF_NONE = $00000000;
   NIIF_INFO = $00000001;
   NIIF_WARNING = $00000002;
   NIIF_ERROR = $00000003;
   NIF_STATE = $00000008;
   NIF_INFO = $00000010;
   NIF_GUID = $00000020;

...


var NID: TNotifyIconData;

// обработка щелчков мыши
procedure TForm1.MTIcon(var a: TMessage);
var P:TPoint;
begin
case a.LParam of
  WM_LBUTTONDBLCLK :  begin
                      Show;
                      end;
  WM_RBUTTONDOWN   :  begin
                      GetCursorPos(P);
                      PopupMenu1.Popup(P.X,P.Y);
                      end;
    end;
end;

// процесс создания формы
procedure TForm1.FormCreate(Sender: TObject);
begin
// невидимая форма
Application.ShowMainForm:=false;
// параметры иконки
with NID do
 begin
 cbSize:= SizeOf(TNotifyIconData);
 Wnd:=Handle;
 uID:=1;
 uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
 uCallbackMessage:=MyTrayIcon;
 hIcon:=Application.Icon.Handle;
 szTip:='Это я!!!';
 end;
// добавляем иконку  
Shell_NotifyIcon(NIM_ADD,@NID);
end;

procedure TForm1.N1Click(Sender: TObject);
begin
Show;
end;

// событие завершение работы приложения
procedure TForm1.FormDestroy(Sender: TObject);
begin
// уничтожаем иконку
Shell_NotifyIcon(NIM_Delete,@NID);
end;

// функция создания сообщения из трея
function MessWin(const Window: HWND; const IconID: Byte; const Timeout: TBalloonTimeout; const BalloonText, BalloonTitle: String; const BalloonIconType: TBalloonIconType): Boolean;
const
 aBalloonIconTypes : array[TBalloonIconType] of Byte = (NIIF_NONE, NIIF_INFO, NIIF_WARNING, NIIF_ERROR);
var
 NID_50 : TNotifyIconDataEx;
begin
 FillChar(NID_50, SizeOf(TNotifyIconDataEx), 0);
 with NID_50 do begin
   cbSize := SizeOf(TNotifyIconDataEx);
   hWnd := Window;
   uID := IconID;
   uFlags := NIF_INFO;
   StrPCopy(szInfo, BalloonText); 
   TimeoutOrVersion := Timeout * 1000;
   StrPCopy(szInfoTitle, BalloonTitle);
   dwInfoFlags := aBalloonIconTypes[BalloonIconType]; 
 end{with};
 Result := Shell_NotifyIcon(NIM_MODIFY, @NID_50); 
end;

// по какому-то событию показываем сообщение
// например клику по форме
procedure TForm1.FormClick(Sender: TObject);
begin
MessWin(Form1.Handle, 1, 10, 'Здесь мой текст', 'заголовок', bitWarning);
end;


Автор: ilya198293 19.6.2007, 15:25
Что-то вообще тяжко с сообщением в трее...
По инету всего много, но что-то у меня не получается...
Использую CoolTrayIcon1...
Пишу
Код

CoolTrayIcon1.ShowBalloonHint('Заколовок','Сообщение',bitInfo,10);

но выходит ошибка - ругается на тип bitInfo, что типа несоответствие типов TBalloonHintIcon и TBalloonIconType...

Автор: Rouse_ 19.6.2007, 15:46
В FWTrayIcon оберни вызов Shell_NotifyIcon в Win32Check т.е. должно получиться:

Код

//  Показываем BalloonHint для нашей иконки в трее
// =============================================================================
function TFWTrayIcon.ShowBalloonHint(const Hint, Title: String;
  Style: TFWBalloonHintStyle; TimeOut: TFWBalloonTimeout): Boolean;
const
  BalloonStyle: array[TFWBalloonHintStyle] of Byte =
    (NIIF_NONE, NIIF_INFO, NIIF_WARNING, NIIF_ERROR);
var
  BalonNID: _NOTIFYICONDATAA_V2;
begin
  // Выполняем данную процедуру только если версия Shell32.dll больше четвертой
  Result := GetShellVersion >= NEED_SHELL_VER;
  if not Result then Exit;
  // Для отображения BalloonHint используем немного расширенную структуру
  ZeroMemory(@BalonNID, NOTIFYICONDATA_V2_SIZE);
  BalonNID.cbSize := NOTIFYICONDATA_V2_SIZE;
  // Копируем необходимые св-ва со старой структуры
  BalonNID.Wnd := FTrayIcon.Wnd;
  BalonNID.uID := FTrayIcon.uID;
  // Добавляем свои данные
  StrPCopy(BalonNID.szInfo, Hint);
  StrPCopy(BalonNID.szInfoTitle, Title);
  BalonNID.UNIONNAME.uTimeout := TimeOut * 1000;
  BalonNID.dwInfoFlags := BalloonStyle[Style];
  // Выставляем флаг !!!
  BalonNID.uFlags := NIF_INFO;
  // Вуаля ;)
  Win32Check(Shell_NotifyIcon(NIM_MODIFY, @BalonNID));
end;

Если что-то не так - то ты сразу увидишь причину ошибки.

Автор: ilya198293 20.6.2007, 06:41
Вот здесь
http://www.delphisources.ru/pages/sources/raznoe/2006_year/fw_hint_trayicon.html
написано что ограничения у текста в трее у компонента FWTrayIcon 255 символов...мне нужно больше - около 700 символов не считая пробелов

Добавлено через 2 минуты и 59 секунд
и пытался его просто для эксперемента установить...сказал что нет фала ресурса

Автор: Rouse_ 20.6.2007, 10:37
Цитата(ilya198293 @  20.6.2007,  07:41 Найти цитируемый пост)
написано что ограничения у текста в трее у компонента FWTrayIcon 255 символов...мне нужно больше - около 700 символов не считая пробелов

Это не ограничение компонента, это ограничение системы smile
Цитата(ilya198293 @  20.6.2007,  07:41 Найти цитируемый пост)
и пытался его просто для эксперемента установить...сказал что нет фала ресурса 

А ты качай его с родного сайта smile
http://rouse.drkb.ru/components.php#fwtray

Автор: ilya198293 20.6.2007, 11:03
Эту ссылку я первым делом прошарил когда читал сообщение от 19.6.2007, 15:46.
В BDS открываю файл FWExtTrayOnce.dpk как проект.
Не находит ресурс файл FWExtTrayOnce.res. Типа пытается его пересоздать.
Потом начинаю компилировать и вот тут он не компилируется.

Ну если это ограничение системы тогда нужно подумать нужно ли мне это вообще...хотя чисто для практики стоит покопаться...

Автор: Rouse_ 20.6.2007, 12:57
Цитата(ilya198293 @  20.6.2007,  12:03 Найти цитируемый пост)
Не находит ресурс файл FWExtTrayOnce.res. Типа пытается его пересоздать.

Перед тем как компилировать - нужно его собрать. Нажми Build первым делом.
Цитата(ilya198293 @  20.6.2007,  12:03 Найти цитируемый пост)
Ну если это ограничение системы тогда нужно подумать нужно ли мне это вообще

Да это системное ограничение. Посмотреть можешь тут http://msdn2.microsoft.com/en-us/library/ms538121.aspx
Обрати внимание на размеры поллей в структуре.
Код

typedef struct _NOTIFYICONDATA {
    DWORD cbSize;
    HWND hWnd;
    UINT uID;
    UINT uFlags;
    UINT uCallbackMessage;
    HICON hIcon;
    TCHAR szTip[64];
    DWORD dwState;
    DWORD dwStateMask;
    TCHAR szInfo[256];
    union {
        UINT uTimeout;
        UINT uVersion;
    };
    TCHAR szInfoTitle[64];
    DWORD dwInfoFlags;
    GUID guidItem;
    HICON hBalloonIcon;
} NOTIFYICONDATA, *PNOTIFYICONDATA;

Автор: ilya198293 20.6.2007, 13:09
Попробовал всё в 7-ке - прошло и без сборки...просто выдал какое-то предупреждение...но скомпилировать скомпилировал...
А в 2006 продолжает выдавать ту же самую ошибку при Build.

Код

  public
    function GetAttributes: TPropertyAttributes; override;
    procedure SetValue(const Value: string); override;
    procedure GetValues(Proc: TGetStrProc); override;
{$IFDEF DFS_COMPILER_5_UP}
    procedure ListMeasureHeight(const Value: string; ACanvas: TCanvas;
      var AHeight: Integer);
    procedure ListMeasureWidth(const Value: string; ACanvas: TCanvas;
      var AWidth: Integer);
    procedure ListDrawValue(const Value: string; ACanvas: TCanvas;
      const ARect: TRect; ASelected: Boolean); 
{$ENDIF}
  end;


procedure Register;


причём перекидывается на последний end из приведённого текста

Добавлено через 2 минуты и 50 секунд
и ещё говорит при этом что неизвестен идентификатор ListMeasureHeight, ListMeasureWidth, ListDrawValue

Автор: Rouse_ 20.6.2007, 14:26
Убери все {$IFDEF DFS_COMPILER_5_UP} и {$ENDIF}

Автор: ilya198293 20.6.2007, 15:23
Получилось...
Имел бы возможность поднял бы репутацию...но пока у меня нет 100 сообщений...так что могу сказать только спасибоsmile
Казалось бы вывести сообщение...по сути что-то типа ShowMessage, только в трее...и столько заморочек...

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