Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблемка с BalloonHints [Delphi, Vista]


Elec3C ©   (2007-10-31 20:37:00) 

Есть модуль ballonhint'a:

uses Windows, ShellApi, KOL;

type
NotifyIconData_50 = record
  cbSize: DWORD;
  Wnd: HWND;
  uID: UINT;
  uFlags: UINT;
  uCallbackMessage: UINT;
  hIcon: HICON;
  szTip: array[0..MAXCHAR] of AnsiChar;
  dwState: DWORD;
  dwStateMask: DWORD;
  szInfo: array[0..MAXBYTE] of AnsiChar;
  uTimeout: UINT;
  szInfoTitle: array[0..63] of AnsiChar;
  dwInfoFlags: DWORD;
end;

TBalloonTimeout = 10..30;
TBalloonIconType = (bitNone, bitInfo, bitWarning, bitError);

const
NIF_INFO = $00000010;

NIIF_NONE = $00000000;
NIIF_INFO = $00000001;
NIIF_WARNING = $00000002;
NIIF_ERROR = $00000003;

function BalloonTrayIcon(const Window: HWND; const IconID: Byte;
const Timeout: TBalloonTimeout; const BalloonText, BalloonTitle:
string; const BalloonIconType: TBalloonIconType): Boolean;

implementation

function BalloonTrayIcon(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: NotifyIconData_50;

begin
FillChar(NID_50, SizeOf(NotifyIconData_50), 0);
with NID_50 do begin
  cbSize := SizeOf(NotifyIconData_50);
  Wnd := Window;
  uID := IconID;
  uFlags := NIF_INFO;
  StrPCopy(szInfo, BalloonText);
  uTimeout := Timeout * 1000;
  StrPCopy(szInfoTitle, BalloonTitle);
  dwInfoFlags := aBalloonIconTypes[BalloonIconType];
end;

Result := Shell_NotifyIcon(NIM_MODIFY, @NID_50);
end;

На форме есть стандартный TrayIcon(TKolTrayIcon).
Вызываю ballonhint функцией BalloonTrayIcon(TrayIcon1.Wnd, 1, 10, 'text', 'title', bitWarning); - баллон не хочет появлятся. Подскажите, в чём ошибка?

P.S. BAPTayIcon не предлагать.


Elec3C   (2007-11-25 01:45:00) [1]

Спасибо за исходник с exe'шником, но ничего не выходит. Может глюк висты или под неё нужно по-другому писать - чёрт его знает. Ладно пускай остаётся время по умолчанию.


Compiler   (2007-11-24 20:42:00) [2]

У меня ХР SP2/
А может дело в настройках Винды. Знаю, в реестре есть параметр, который отвечает за показ этих самых Balloon'ов. Если его изменить, то Balloon'ов не видно.  Может там и параметр продолжительности показа есть. Этого неведаю.

P.S. Проверь почту


Elec3C   (2007-11-24 19:23:00) [3]


> Compiler ©

Если можешь, пришли на ящик исходник программки с балонхинтом.


> А он работает или нет.

Я запускал тестовый exe'шник - у меня не пашет(ось Vista) нет!


Compiler   (2007-11-24 16:43:00) [4]


> Elec3C ©   (24.11.07 14:09) [14]

У меня работает как надо, ровно 10 сек потом по таймеру скрывается.
> P.S. BAPTayIcon не предлагать.

А он работает или нет.


Elec3C   (2007-11-24 14:09:00) [5]

Значит, я пишу следующее:

...

type
 DUMMYUNIONNAME = record
   case Integer of
     0 : (uTimeout : UINT);
     1 : (uVersion : UINT);
 end;

 _NOTIFYICONDATAA_V2 = record
   cbSize           : DWORD;
   Wnd              : HWND;
   uID              : UINT;
   uFlags           : UINT;
   uCallbackMessage : UINT;
   hIcon            : HICON;
   szTip            : array [0..MAXCHAR] of AnsiChar;
   dwState          : DWORD;
   dwStateMask      : DWORD;
   szInfo           : array [0..MAXBYTE] of AnsiChar;
   UNIONNAME        : DUMMYUNIONNAME;
   szInfoTitle      : array [0..63] of AnsiChar;
   dwInfoFlags      : DWORD;
 end;

...

implementation

function ShowBalloonHint(Handle:HWND; const Hint, Title: String; const Style, TimeOut: Byte): Boolean; forward;

function TimerCallBack(wnd:HWND; msg,wp,lp:Longint): Longint; Stdcall;
begin
result:=0;
if (msg=WM_TIMER) and (wp=109) then
begin
KillTimer(wnd,wp);
ShowBalloonHint(wnd,'','',0,0);
end;
end;

function ShowBalloonHint(Handle:HWND; const Hint, Title: String; const Style, TimeOut: Byte): Boolean;
const
 NOTIFYICONDATA_V2_SIZE = $1E8;
 NIF_INFO        = $00000010;
var
BalonNID: _NOTIFYICONDATAA_V2;
begin
ZeroMemory(@BalonNID, NOTIFYICONDATA_V2_SIZE);
BalonNID.cbSize := NOTIFYICONDATA_V2_SIZE);
BalonNID.Wnd := DWORD(Handle);
BalonNID.uID := DWORD(Form1.TrayPP);
StrPCopy(BalonNID.szInfo, Hint);
StrPCopy(BalonNID.szInfoTitle, Title);
BalonNID.dwInfoFlags := Style;
BalonNID.uFlags := NIF_INFO;
BalonNID.UNIONNAME.uTimeout := TimeOut * 1000;
if (Hint<>'') and (Title<>'') and (TimeOut>0) then
SetTimer(Handle,109,TimeOut *1000,@TimerCallBack);
Result := Shell_NotifyIcon(NIM_MODIFY, @BalonNID);
end;

...

// Вызываю балонхинт
ShowBalloonHint(Form.Handle, 'Текст', 'Заголовок', 4, 10);

Всё равно, ничего не выходит. Может я не так что-то пишу?


Compiler   (2007-11-24 12:10:00) [6]

При интервале более 1 минуты Hint падает где-то после 70 сек, а до минуты все работает. С добавлением BalonNID.UNIONNAME.uTimeout := TimeOut * 1000;


Elec3C   (2007-11-24 00:38:00) [7]

Всё равно не выходит:((


Compiler   (2007-11-23 22:39:00) [8]


> Хм?! Не совсем въехал

Можно. Я вот так

function TimerCallBack(wnd:HWND; msg,wp,lp:Longint):Longint; Stdcall;
begin
result:=0;
if (msg=WM_TIMER) and (wp=109) then
begin
KillTimer(wnd,wp);
ShowBalloonHint(wnd,'','',0,0);
end;
end;

//Показать BAllonToolTip
function ShowBalloonHint(Handle:HWND; const Hint, Title: String; const Style, TimeOut: Byte): Boolean;
var
BalonNID: _NOTIFYICONDATAA_V2;
begin
ZeroMemory(@BalonNID, NOTIFYICONDATA_V2_SIZE);
BalonNID.cbSize := NOTIFYICONDATA_V2_SIZE;
BalonNID.Wnd := DWORD(Handle);
BalonNID.uID := DWORD(Tray);
StrPCopy(BalonNID.szInfo, Hint);
StrPCopy(BalonNID.szInfoTitle, Title);
BalonNID.dwInfoFlags := Style;
BalonNID.uFlags := NIF_INFO;
if (Hint<>'') and (Title<>'') and (TimeOut>0) then
SetTimer(Handle,109,TimeOut *1000,@TimerCallBack);
Result := Shell_NotifyIcon(NIM_MODIFY, @BalonNID);
end;


109 - ID Таймера
TimeOut-1..
Tray - PTrayIcon


Elec3C   (2007-11-23 16:01:00) [9]


> Compiler ©

Хм?! Не совсем въехал, как юзать. Можно поподробнее?


Compiler   (2007-11-22 19:42:00) [10]

Да глюк какой-то в этом есть. Я делал по тайиеру

function Times(Wnd:HWND;Msg,Wp,Lp:Integer):bool; stdcall;
begin
result:=false;
if msg=WM_TIMER then
begin
KillTimer(Wnd,1000);
ShowBalloonHint('','',0,0);
end;
end;

SetTimer(Handle,1000,TimeOut *1000,@Times);


Elec3C   (2007-11-22 15:16:00) [11]

^


Elec3C   (2007-11-20 16:47:00) [12]

^


Elec3C   (2007-11-19 18:59:00) [13]

^


Elec3C   (2007-11-18 02:33:00) [14]

Время "продолжительности" показа BalloonHint'а не изменяется(менял с 7 на 10, 15). Как было по умолчанию(вроде бы 3 сек), так и осталось. В чём ошибка?


Elec3C   (2007-11-01 15:11:00) [15]


> А если так

Работает. Спасибо.


Compiler   (2007-11-01 01:01:00) [16]

А если так

type
DUMMYUNIONNAME = record
  case Integer of
    0: (
      uTimeout: UINT);
    1: (
      uVersion: UINT);
end;
NotifyIconData_50 = record
  cbSize: DWORD;
  Wnd: HWND;
  uID: UINT;
  uFlags: UINT;
  uCallbackMessage: UINT;
  hIcon: HICON;
  szTip: array [0..MAXCHAR] of AnsiChar;
  dwState: DWORD;
  dwStateMask: DWORD;
  szInfo: array [0..MAXBYTE] of AnsiChar;
  UNIONNAME: DUMMYUNIONNAME;
  szInfoTitle:  array [0..63] of AnsiChar;
  dwInfoFlags: DWORD;
end;

function ShowBalloonHint(const Handle, uID: DWORD; const Hint, Title: String; const Style, TimeOut: Byte): Boolean;
const
 NOTIFYICONDATA_V2_SIZE = $1E8;
 NIF_INFO        = $00000010;
var
BalonNID: NotifyIconData_50;
begin
ZeroMemory(@BalonNID, NOTIFYICONDATA_V2_SIZE);
BalonNID.cbSize := NOTIFYICONDATA_V2_SIZE;
BalonNID.Wnd := Handle;
BalonNID.uID := uID;
StrPCopy(BalonNID.szInfo, Hint);
StrPCopy(BalonNID.szInfoTitle, Title);
BalonNID.UNIONNAME.uTimeout := TimeOut * 1000;
BalonNID.dwInfoFlags := Style;
BalonNID.uFlags := NIF_INFO;
Result := Shell_NotifyIcon(NIM_MODIFY, @BalonNID);
end;

procedure TForm1.Button1Click(Sender: PObj);
begin
ShowBalloonHint(form.handle,DWORD(TrayIcon1),'Текст','Заголовок',2,7);
end;


Elec3C   (2007-11-01 00:25:00) [17]


> А почему?

Все возможности его мне не надо.

А в чём ошибка то?


mdw   (2007-10-31 21:24:00) [18]


> P.S. BAPTayIcon не предлагать.

А почему?


Наверх

Титульная страница Поиск, карта сайта Написать письмо