Конференция "KOL" » Проблемка с BalloonHints [Delphi, Vista]
 
  • Elec3C © (31.10.07 20:37) [0]
    Есть модуль 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 не предлагать.
  • mdw © (31.10.07 21:24) [1]

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

    А почему?
  • Elec3C © (01.11.07 00:25) [2]

    > А почему?

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

    А в чём ошибка то?
  • Compiler © (01.11.07 01:01) [3]
    А если так

    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 © (01.11.07 15:11) [4]

    > А если так

    Работает. Спасибо.
  • Elec3C © (18.11.07 02:33) [5]
    Время "продолжительности" показа BalloonHint'а не изменяется(менял с 7 на 10, 15). Как было по умолчанию(вроде бы 3 сек), так и осталось. В чём ошибка?
  • Elec3C © (19.11.07 18:59) [6]
    ^
  • Elec3C © (20.11.07 16:47) [7]
    ^
  • Elec3C © (22.11.07 15:16) [8]
    ^
  • Compiler © (22.11.07 19:42) [9]
    Да глюк какой-то в этом есть. Я делал по тайиеру

    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 © (23.11.07 16:01) [10]

    > Compiler ©

    Хм?! Не совсем въехал, как юзать. Можно поподробнее?
  • Compiler © (23.11.07 22:39) [11]

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

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

    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 © (24.11.07 00:38) [12]
    Всё равно не выходит:((
  • Compiler © (24.11.07 12:10) [13]
    При интервале более 1 минуты Hint падает где-то после 70 сек, а до минуты все работает. С добавлением
    BalonNID.UNIONNAME.uTimeout := TimeOut * 1000;

  • Elec3C © (24.11.07 14:09) [14]
    Значит, я пишу следующее:

    ...

    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 © (24.11.07 16:43) [15]

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

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

    А он работает или нет.
  • Elec3C © (24.11.07 19:23) [16]

    > Compiler ©

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


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

    Я запускал тестовый exe'шник - у меня не пашет(ось Vista) нет!
  • Compiler © (24.11.07 20:42) [17]
    У меня ХР SP2/
    А может дело в настройках Винды. Знаю, в реестре есть параметр, который отвечает за показ этих самых Balloon'ов. Если его изменить, то Balloon'ов не видно.  Может там и параметр продолжительности показа есть. Этого неведаю.

    P.S. Проверь почту
  • Elec3C © (25.11.07 01:45) [18]
    Спасибо за исходник с exe'шником, но ничего не выходит. Может глюк висты или под неё нужно по-другому писать - чёрт его знает. Ладно пускай остаётся время по умолчанию.
 
Конференция "KOL" » Проблемка с BalloonHints [Delphi, Vista]
Есть новые Нет новых   [134431   +10][b:0][p:0.002]