-
Есть модуль 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 не предлагать.
-
> P.S. BAPTayIcon не предлагать.
А почему?
-
> А почему?
Все возможности его мне не надо.
А в чём ошибка то?
-
А если так
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;
-
> А если так
Работает. Спасибо.
-
Время "продолжительности" показа BalloonHint'а не изменяется(менял с 7 на 10, 15). Как было по умолчанию(вроде бы 3 сек), так и осталось. В чём ошибка?
-
^
-
^
-
^
-
Да глюк какой-то в этом есть. Я делал по тайиеру 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);
-
> Compiler ©
Хм?! Не совсем въехал, как юзать. Можно поподробнее?
-
> Хм?! Не совсем въехал
Можно. Я вот так
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;
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
-
Всё равно не выходит:((
-
При интервале более 1 минуты Hint падает где-то после 70 сек, а до минуты все работает. С добавлением BalonNID.UNIONNAME.uTimeout := TimeOut * 1000;
-
Значит, я пишу следующее:
...
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);
Всё равно, ничего не выходит. Может я не так что-то пишу?
-
> Elec3C © (24.11.07 14:09) [14]
У меня работает как надо, ровно 10 сек потом по таймеру скрывается. > P.S. BAPTayIcon не предлагать.
А он работает или нет.
-
> Compiler ©
Если можешь, пришли на ящик исходник программки с балонхинтом.
> А он работает или нет.
Я запускал тестовый exe'шник - у меня не пашет(ось Vista) нет!
-
У меня ХР SP2/ А может дело в настройках Винды. Знаю, в реестре есть параметр, который отвечает за показ этих самых Balloon'ов. Если его изменить, то Balloon'ов не видно. Может там и параметр продолжительности показа есть. Этого неведаю.
P.S. Проверь почту
-
Спасибо за исходник с exe'шником, но ничего не выходит. Может глюк висты или под неё нужно по-другому писать - чёрт его знает. Ладно пускай остаётся время по умолчанию.
|