powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Хочу понять логику "уведомлений в трей".
33 сообщений из 33, показаны все 2 страниц
Хочу понять логику "уведомлений в трей".
    #38294730
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока возился с треем и тултипами, понял что хорошо бы добавить в приложение
Tray Notifications

В принципе вызвать такой Ballon Notification не проблема:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Private Sub CommandBallon_Click()
  Dim nid As NOTIFYICONDATA
  With nid 'вывов уведомления в трей
    .cbSize = Len(nid) 'Size of structure
    .hwnd = Me.hwnd 'Handle to parent window
    .uID = vbNull 'Id of the icon
    .uFlags = NIF_INFO 'Options: show balloon
    .dwInfoFlags = NIIF_INFO
    .uTimeoutAndVersion = 1000 'Timeout when the balloon dissapear
    .szInfo = "Message small font" & Chr(0) 'Message
    .szInfoTitle = "Title large font" & Chr(0) 'Title
  End With
  Shell_NotifyIcon NIM_MODIFY, nid 'Show balloon
End Sub



Какого размера иконки туда втыкать и какие (стандартные или свои) - с этим я думаю разберусь.

Но я сперва хочу понять логику. Трей посылает приложению сообщения. В целом ловлю их без проблем.

NIN_BALLOONSHOW -тултип появился - это понятно
NIN_BALLOONHIDE -???

Вопрос #1: пользователь щелкает по сообщению
Код: vbnet
1.
        NIN_BALLOONUSERCLICK


Если у меня несколько типов сообщений. Щелчок по каждому типу предполагает различные действия.
Причем один и тот же тип может иметь разные параметры.
Например:
Получен новый файл failo1.txt. Щелкните по сообщению чтоб посмотреть.
Получен новый файл FIAILO2.txt. Щелкните по сообщению чтоб посмотреть.
Отправлен файл FAIL_OUT_1.txt. Щелкните по сообщению чтоб посмотреть лог.
Т.е. получив NIN_BALLOONUSERCLICK приложение должно исполнить РАЗНЫЕ действия.
А вот как я пойму какое именно? Код выше не снабжает Ballon Notification "индивидуальной начинкой" (кроме текстов и картинки), а NIN_BALLOONUSERCLICK вроде как не дает информации о том по какому именно типу Ballon Notification и с каким параметром стукнули. Я могу напр. задавать какие-то глобальные параметры приложения при вызове Ballon Notification, но это думаю дурной подход: если только одно приложение посылает уведомления в трей, то новое сразу заменит предыдущее, а вот если в трее висит уведомление от ДРУГОГО приложения, то уведомления от моего выстроятся в очередь и будут последовательно появляться только как закрою чужое Notification. Т.е. предложенная логика не сработает.
Как правильно сделать?

Вопрос #2:
Код: vbnet
1.
.uTimeoutAndVersion = 1000 'Timeout when the balloon dissapear


Такое ощущение что таймаут этот работает "через одно место". Не хочет оно само закрываться.

Вопрос #3:
Сообщение в трей типа.
Вам звонит абонент такой-то.
Простой вариант: "Щелкните по Notification чтобы ответить на вызов".
А как сделать вожможность выбора
2 варианта : ответить/сбросить вызов
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38294777
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что никто не знает? Я не знаю.

Попробую пояснить.

Если приложение выводит Notification TYPE#1
Код: vbnet
1.
2.
3.
4.
5.
6.
Private Sub CommandBallonType1_Click()
  Dim nid As NOTIFYICONDATA
  With nid 'вывов уведомления в трей
...
    .szInfo = "Это сообщение ТИПА #1" & Chr(0) 'Message
    .szInfoTitle = "TYPE#1" & Chr(0) 'Title


То щелкнув по этому Notification (когда именно оно вылезло в трей)
Я хочу вывести сообщение
Код: vbnet
1.
2.
        Case NIN_BALLOONUSERCLICK
           msgbox "Это TYPE#1"


-----
Если приложение выводит Notification TYPE#2
Код: vbnet
1.
2.
3.
4.
5.
6.
Private Sub CommandBallonType2_Click()
  Dim nid As NOTIFYICONDATA
  With nid 'вывов уведомления в трей
...
    .szInfo = "Это сообщение ТИПА #2" & Chr(0) 'Message
    .szInfoTitle = "TYPE#2" & Chr(0) 'Title


То щелкнув по этому Notification (когда именно оно вылезло в трей)
Я хочу вывести сообщение
Код: vbnet
1.
2.
        Case NIN_BALLOONUSERCLICK
           msgbox "Это TYPE#2"



Постановка вопроса упрощена и более чем ясна.
Разные Notification -> Разные действия.

ни NIN_BALLOONSHOW ни NIN_BALLOONUSERCLICK не дают ответа на вопрос к какому именно сообщению они относятся.

М.б. поиграться с .uCallbackMessage?
Но сдается мне что это переназначит .uCallbackMessage ГЛОБАЛЬНО для данной трей-иконки.
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38294782
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NOTIFYICONDATA в NIN_BALLOONUSERCLICK получить можешь?
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38294799
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А хотя не надо.

UINT uID;

The application-defined identifier of the taskbar icon. The Shell uses either (hWnd plus uID) or guidItem to identify which icon to operate on when Shell_NotifyIcon is invoked. You can have multiple icons associated with a single hWnd by assigning each a different uID. If guidItem is specified, uID is ignored.

uCallbackMessage
...
HIWORD(lParam) contains the icon ID. Смысл в том, что можно попробовать добавить несколько иконок, но всем, кроме одной, сделать NIS_HIDDEN и проставить uID, по которому и различать.
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38294804
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyNOTIFYICONDATA в NIN_BALLOONUSERCLICK получить можешь?
Смотри.
===
NOTIFYICONDATA structure

When the uVersion member is either 0 or NOTIFYICON_VERSION, the wParam parameter of the message contains the identifier of the taskbar icon in which the event occurred. This identifier can be 32 bits in length. The lParam parameter holds the mouse or keyboard message associated with the event. For example, when the pointer moves over a taskbar icon, lParam is set to WM_MOUSEMOVE.

When the uVersion member is NOTIFYICON_VERSION_4, applications continue to receive notification events in the form of application-defined messages through the uCallbackMessage member, but the interpretation of the lParam and wParam parameters of that message is changed as follows:

•LOWORD(lParam) contains notification events, such as NIN_BALLOONSHOW, NIN_POPUPOPEN, or WM_CONTEXTMENU.
•HIWORD(lParam) contains the icon ID. Icon IDs are restricted to a length of 16 bits.
•GET_X_LPARAM(wParam) returns the X anchor coordinate for notification events NIN_POPUPOPEN, NIN_SELECT, NIN_KEYSELECT, and all mouse messages between WM_MOUSEFIRST and WM_MOUSELAST. If any of those messages are generated by the keyboard, wParam is set to the upper-left corner of the target icon. For all other messages, wParam is undefined.
•GET_Y_LPARAM(wParam) returns the Y anchor coordinate for notification events and messages as defined for the X anchor.


===
У меня на XP either 0 or NOTIFYICON_VERSION,
на >=Виста NOTIFYICON_VERSION_4

Пока что на XP пытаюсь соображать (без Version 4)

Код такой:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
   Case WM_MySysTrayNotify 'уведомления Tray -вместо WM_MOUSEMOVE
      Dim lw_lparam
      lw_lparam = LOWORD(lParam)
      Select Case lw_lparam
...
         Case NIN_BALLOONUSERCLICK
          Debug.Print "NIN_BALLOONUSERCLICK"
          Debug.Print HIWORD(lParam)
          Debug.Print wParam
          Form1.Text1.Text = Form1.Text1.Text & vbCrLf & "NIN_BALLOONUSERCLICK" 'debug



NIN_BALLOONUSERCLICK==LOWORD(lParam) я ловлю.
при этом у меня дебаг пишет (см. код выше):
Код: vbnet
1.
2.
3.
NIN_BALLOONUSERCLICK
 0 
 1 


чего значит wparam=1 я не знаю. В описании не сказано как получить NOTIFYICONDATA
Надо вызывать какую то еще ф-цию?
В принципе информацию можно получать и запоминать из NIN_BALLOONSHOW (ballon всегда один) и запоминать, но там не лучше.

Почему не могу сразу запоминать в CommandBallon_Click понял?
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38294811
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так а что насчет uID? HIWORD(lParam) = 0 вижу, но еще вижу .uID = vbNull в первом посте. В CommandBallonType2_Click отправляешь, в HIWORD(lParam) ловишь, тем и определяешь тип сообщения.
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38294814
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы уж было совсем понятно,

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Public Enum enMsgType
    mtSent = 1
    mtReceived = 2
end enum

Private Sub CommandBallon_Click()
  Dim nid As NOTIFYICONDATA
  With nid 'вывов уведомления в трей
    .uID = mtSent 
    ....
  End With
  Shell_NotifyIcon NIM_MODIFY, nid 'Show balloon
End Sub

Case WM_MySysTrayNotify 'уведомления Tray -вместо WM_MOUSEMOVE
      Select Case lw_lparam
         Case NIN_BALLOONUSERCLICK
           Select Case HIWORD(lParam) 
              Case mtSent 
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38294819
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy......HIWORD(lParam) contains the icon ID. Смысл в том, что можно попробовать добавить несколько иконок, но всем, кроме одной, сделать NIS_HIDDEN и проставить uID, по которому и различать.
Не забывай что
HIWORD(lParam) contains the icon ID
относится к version 4,
а логика должно работать и на XP тоже
Чего-то меня такой подход в принципе (логически) смущает, хотя я на этот uID тоже пялился.
>>несколько(!!!) иконок
Это если сообщений 2-3 типа.
Но в данном типе сообщения может быть параметр(возможно скрытый, т.е. его нет в тексте тултипа): имя-путь к конкретному файлу, номер телефона, ID вызова (я еще не продумывал, исследую возможности).

По логике очереди из сообщений не нужно, так можно и юзера задолбать.
Логично показывать крайнее сообщение (из тех что сочту нужным выводить),
а предыдущее убивать(если таковое имеется).

И если с треем работает только моя прога, то оно так и будет.
Т.е. условно Private Sub CommandBallon_Click()
вытеснит то что было раньше.
И я в CommandBallon_Click могу полностью запомнить ТИП СООБЩЕНИЯ и ПАРАМЕТРЫ.

Но, если в текущий момент система отображает "Обновления для вашего Виндоус готовы" и прочую ересь,
то если нажать CommandBallon_Click (или ей подобные) несколько раз, то пока я не закрою чужой Notify, я не увижу ничего.
А когда закрою, то последовательно получу ВСЕ свои CommandBallon_Click, и каждое надо последовательно закрывать или кликать.
Во первых, я не уверен что хочу этого.
А во-вторых, я таким методом помню только ТИП СООБЩЕНИЯ и ПАРАМЕТРЫ которые от последнего нажатия CommandBallon_Click.
Т.е. проблема с "Очередью".
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38294824
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я тут в десктоп на дотнете вляпался. Там все это делается так быстро . Работу, на которую на VB6 у меня ушла бы неделя, я сделал за два дня. И это при том, что на VB6 у меня куча наработок, а дотнетовским десктопом занялся почти с нуля.
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38294829
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyЧтобы уж было совсем понятно,...
Счас попробую еще поиграться.

У тебя VB6 живой есть?
Если есть желание попробовать
Вот этот мой тест проект, там есть кнопка "Ballon Notify".
Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon)

http://www.sql.ru/forum/actualfile.aspx?id=14342056

+вот эти константы.
Там могут быть не все.

Код: vbnet
1.
2.
3.
4.
5.
Private Const WM_USER = &H400
Public Const NIN_BALLOONSHOW = (WM_USER + &H2) 'Balloon Tips ??
Public Const NIN_BALLOONHIDE = (WM_USER + &H3) 'Balloon Tips ??
Public Const NIN_BALLOONTIMEOUT = (WM_USER + &H4) 'Balloon Tips ? TimeOut ???,??????/????
Public Const NIN_BALLOONUSERCLICK = (WM_USER + &H5) 'Balloon Tips ???
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38294834
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariyна дотнете...
Не трави душу. Сам давно хочу поиграться в эти неты. Просто есть цель дописать программу. Эти Notification надеюсь последний штрих. Правда еще инсталлятор, help, сайт и и т.п. -волком уже вою, но доделать то надо.
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38294840
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77 Не забывай что
HIWORD(lParam) contains the icon ID
относится к version 4,
а логика должно работать и на XP тожеПо-моему ты путаешь uID с guidItem. На uID нет ограничений.

Дмитрий77 По логике очереди из сообщений не нужно, так можно и юзера задолбать.По логике юзера задолбаешь как раз без очереди. Сразу все выкидываешь и имеешь именно эту картину:
А когда закрою, то последовательно получу ВСЕ свои CommandBallon_Click, и каждое надо последовательно закрывать или кликать.
Дмитрий77 Логично показывать крайнее сообщение (из тех что сочту нужным выводить),
а предыдущее убивать(если таковое имеется).Тогда останется одно крайнее, а остальных юзер даже не увидит. И вот тут-то как раз нужна очередь. Добавлять в коллекцию новые сообщения и брать из нее первое сообщение (удаляя) и не показывать следующее, пока юзер не кликнет тултип. Хотя по большому счету для юзера разницы нет, будут ли они появляться одно за другим или одно из-под другого.
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38294843
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77AntonariyЧтобы уж было совсем понятно,...
Счас попробую еще поиграться.

У тебя VB6 живой есть?
Если есть желание попробоватьПопробовал бы, но нет желания собирать все эти фрагменты в одну кучу, да и аттач развесистый. Было бы все в одном спойлере/паре модулей, без вопросов.

ВБ живой есть, как раз поставил его с мыслью, а не слабать ли этот десктоп на нем. Перед этим что-то успел сделать на дотнете, а когда на ВБ дошел до половины сделанного и осознал, что потратил времени в два раза больше, то вернулся к первому варианту. Ни для чего, кроме portable и activex exe, вб больше не нужен.
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38294846
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyИ вот тут-то как раз нужна очередь. Добавлять в коллекцию новые сообщения и брать из нее первое сообщение (удаляя) и не показывать следующее, пока юзер не кликнет тултип. Хотя по большому счету для юзера разницы нет, будут ли они появляться одно за другим или одно из-под другого.Если действовать таким образом, то не нужны все эти пляски с uID. Сообщение из очереди не удалять, а смотреть его параметры при клике на тултипе, выполнять соответствующее действие, и тогда уже удалять.
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38294847
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyДмитрий77 Не забывай что
HIWORD(lParam) contains the icon ID
относится к version 4,
а логика должно работать и на XP тожеПо-моему ты путаешь uID с guidItem. На uID нет ограничений.
На uID когда его назначаешь, ограничений м.б. и нет.
Но на то что имеем в uCallbackMessage очень даже есть:

When the uVersion member is either 0 or NOTIFYICON_VERSION
wParam parameter of the message contains the identifier of the taskbar icon in which the event occurred.

When the uVersion member is NOTIFYICON_VERSION_4,
HIWORD(lParam) contains the icon ID.

Если на XP
Код: vbnet
1.
2.
3.
NIN_BALLOONUSERCLICK
 0 'HIWORD(lParam)
 1


то на Висте v.4
Код: vbnet
1.
2.
3.
NIN_BALLOONUSERCLICK
 1  'HIWORD(lParam)
 0


Ну, в принципе это соответствует.
Только у меня на .uID 2, 3, 4 вообще не реагирует.
Хотя догадываюсь почему.
наверно NIM_ADD надо неск. раз делать с разными .uID
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38294848
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyПопробовал бы, но нет желания собирать все эти фрагменты в одну кучу, да и аттач развесистый. Было бы все в одном спойлере/паре модулей, без вопросов.
Там всего то из сути
1) Form1->CommandBallon_Click()
2) ModuleWinProc->
Public Function NewFormMeWindowProc( _
Case WM_MySysTrayNotify 'уведомления Tray -вместо WM_MOUSEMOVE
3) ModuleTrayIcon
Все как раз собрано и сразу запускается.
А на остальное в свете тек. вопроса можно не смотреть.
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38294853
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyAntonariyИ вот тут-то как раз нужна очередь. Добавлять в коллекцию новые сообщения и брать из нее первое сообщение (удаляя) и не показывать следующее, пока юзер не кликнет тултип. Хотя по большому счету для юзера разницы нет, будут ли они появляться одно за другим или одно из-под другого.Если действовать таким образом, то не нужны все эти пляски с uID. Сообщение из очереди не удалять, а смотреть его параметры при клике на тултипе, выполнять соответствующее действие, и тогда уже удалять.

Я кажется понял что ты хочешь сказать.
Мы про разные очереди говорим.

Если выкидывать сообщение в лоб, то два "автоматических" варианта развития событий.
1) Наиболее вероятный. Юзер видит сообщение. Если вдруг поступает новое сообщение, то оно вытесняет предыдущее. Если юзер например "потянулся нажать на то что видит", а тут пришло новое, то он и нажать то не успеет. Нехорошо как-то.
2) Если "трей занят чужим сообщением", то все мои попадают в ОБЩУЮ ОЧЕРЕДЬ ТРЕЯ (вне моего приложения). И это НЕУПРАВЛЯЕМО.Т.е. все сообщения будут показаны и приложение не в состоянии их идентифицировать.
Если например идет ВХОДЯЩИЙ ТЕЛЕФОННЫЙ ВЫЗОВ, а юзер 2 минуты читал сообщения про обновления виндоуса и акробата, то когда он прочтет что надо ответить на телефон, то это сообщение уже будет вообще не актуально.
Я говорил именно про эту СИСТЕМНУЮ ОЧЕРЕДЬ.

Ты предлагаешь создать ОЧЕРЕДЬ-БУФЕР ВНУТРИ САМОГО ПРИЛОЖЕНИЯ. Так?
В принципе это разумно. Это будет управляемая очередь.
1) Я могу расставить приоритеты, выводить более важное сообщение вне зависимости от поступления. Например "ВХОДЯЩИЙ ВЫЗОВ" важнее чем "Доступно обновление моей программы"
2) Я могу удалить сообщение из буфера не показывая его. Или заменить. Ну например, тот же "ВХОДЯЩИЙ ВЫЗОВ" бесполезно показывать если понятно что он уже упущен и т.п.

А чтоб понять что сообщение отработано и переходить к следующему (если есть к чему) у меня есть два рабочих сообщения:
Код: vbnet
1.
2.
       Case NIN_BALLOONUSERCLICK 'юзер щелкнул по сообщению
        Case NIN_BALLOONTIMEOUT 'юзер нажал на крестик либо самозакрылось по таймауту.

Выяснять что за сообщение не надо, оно одно и моя программа об этом знает.

Короче логику думаю надо продумывать на базе этой идеи ВНУТРЕННЕЙ ОЧЕРЕДИ.
==

Не совсем понял с таймерами.
На XP похоже плюет на .uTimeoutAndVersion (может висеть бесконечно),
хотя при каком-то действии (то ли мышкой поелозил, то ли в носу поковырялся - чего именно не понял)
таймаут "наконец-то срабатывает".

А Висте похоже вообще плевать - четко 9 секунд и убирается. Об этом кажется в MSDN как раз написано.
Если говорить о вышеупомянутом "ВХОДЯЩИЙ ВЫЗОВ", его логично например показывать на протяжении всего вызова (пока телефон звонит).

На счет XP, кажется понял. Таймаут срабатывает тогда когда поковырявшийся в носу юзер начал "работать" (т.е. мучить мышку и клавиатуру) - и тогда таймер начинает отсчет - ну, это разумно.
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38294949
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77 2) Если "трей занят чужим сообщением", то все мои попадают в ОБЩУЮ ОЧЕРЕДЬ ТРЕЯЯ так понимаю, под очередью ты подразумеваешь обычный оконный z-order. По идее новые тултипы должны появляться поверх старых.

Дмитрий77 И это НЕУПРАВЛЯЕМО.Зато обходимо — достаточно выводить свои уведомленя не в нижнем правом углу у трея, а верхнем правом. Или находить полоску окна своего приложения в таксбаре и выводить на ней, что более эстетично.
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38295150
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy...выводить свои уведомленя не в нижнем правом углу у трея, а верхнем правом. Или находить полоску окна своего приложения в таксбаре и выводить на ней, что более эстетично.
Извини, ты о чем рассуждаешь?
Речь сейчас (и с самого начала топика) идет о стандартных Notifications, без всякой кастомизации:
Notifications
A notification informs users of events that are unrelated to the current user activity, by briefly displaying a balloon from an icon in the notification area .

AntonariyДмитрий77 2) Если "трей занят чужим сообщением", то все мои попадают в ОБЩУЮ ОЧЕРЕДЬ ТРЕЯЯ так понимаю, под очередью ты подразумеваешь обычный оконный z-order. По идее новые тултипы должны появляться поверх старых..
Под очередью (той о которой говорил изначально я, а не той которую предложил ты) я подразумеваю:

NOTIFYICONDATA structure


Remarks
...
No more than one balloon notification at a time can be displayed for the taskbar. If an application attempts to display a notification when one is already being displayed, the new notification is queued and displayed when the older notification goes away .
Т.е. сообщения буферизуются "системой" (приложение уже давно отправило команду его показать) и когда предыдущее закрыто, система показывает следующее (не "поверх" а вместо в том порядке в кот. они были is queued ). И эта очередь управляется СИСТЕМОЙ а не приложением.
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38295264
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77 Речь сейчас (и с самого начала топика) идет о стандартных Notifications, без всякой кастомизации:Да, это я не о том подумал. Позиционирования нет же.
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38295318
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

Но идея твоей очереди (внутри приложения) мне очень понравилась.
===
Сейчас пока воюю с иконкой
Если делать так
Код: vbnet
1.
2.
3.
4.
5.
Public Type NOTIFYICONDATA
...
  guidItem As GUID
  hBalloonIcon As Long
End Type


то Notification вообще не выводится (ни на Висте на 4 версии, ни на XP).

Выводится только если делать так:
Код: vbnet
1.
2.
3.
4.
5.
Public Type NOTIFYICONDATA
...
  guidItem As GUID
  'hBalloonIcon As Long
End Type



NOTIFYICONDATA structure


dwInfoFlags
Type: DWORD
Windows 2000 and later. Flags that can be set to modify the behavior and appearance of a balloon notification. The icon is placed to the left of the title. If the szInfoTitle member is zero-length, the icon is not shown.
NIIF_NONE (0x00000000)
0x00000000. No icon.
NIIF_INFO (0x00000001)
0x00000001. An information icon.
NIIF_WARNING (0x00000002)
0x00000002. A warning icon.
NIIF_ERROR (0x00000003)
0x00000003. An error icon.
NIIF_USER (0x00000004)
0x00000004. Windows XP SP2 and later.
•Windows XP: Use the icon identified in hIcon as the notification balloon's title icon.
•Windows Vista and later: Use the icon identified in hBalloonIcon as the notification balloon's title icon.

...

NIIF_LARGE_ICON (0x00000020)
0x00000020. Windows Vista and later. The large version of the icon should be used as the notification icon.

Смотри,

NIIF_USER+.hicon -на XP работает
NIIF_LARGE_ICON+NIIF_USER+.hicon -на Висте работает (иконка 32х32)

В обоих случаях NIIF_USER выводит ту же иконку что в трее.

Если я правильно понимаю написанное, то

На XP я могу показывать либо стандартные иконки NIIF_INFO, NIIF_WARNING ..., либо иконку что у меня в трее NIIF_USER (но не произвольную - а хотелось бы для разных сообщений разные!!!) - причем размер всегда 16х16

На Вистах если верить MSDN, я могу задать в .hBalloonIcon ПРОИЗВОЛЬНУЮ индивидуальную для данного сообщения иконку.
(но как только добавляешь в структуру этот .hBalloonIcon , Notifications перестают выводиться вообще).
Либо я могу использовать .hicon, но тогда произвольную уже не задашь (тот же набор что и в XP).
Ну, 32х32 выводятся - это да.

По хорошему код такой должен быть
Код: vbnet
1.
2.
3.
Public Const NOTIFYICONDATA_V3_SIZE As Long = 504 '6.0+ structure size
 With nid
    .cbSize = IIf(IsWinVista, Len(nid), NOTIFYICONDATA_V3_SIZE)


на XP естественно Notifications выводятся, но на висте все равно нет (как только разрешил последний член структуры).

Полная структура такая:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
Private Type GUID
  Data1 As Long
  Data2 As Integer
  Data3 As Integer
  Data4(0 To 7) As Byte
End Type

'user defined type required by Shell_NotifyIcon API call
Public Type NOTIFYICONDATA
  cbSize As Long
  hwnd As Long
  uID As Long
  uFlags As Long
  uCallbackMessage As Long
  hIcon As Long
  szTip As String * 128
  dwState As Long
  dwStateMask As Long
  szInfo As String * 256
  uTimeoutAndVersion As Long
  szInfoTitle As String * 64
  dwInfoFlags As Long
  guidItem As GUID
  hBalloonIcon As Long
End Type



Нигде не ошибся?
При наличии последнего элемента hBalloonIcon As Long (к которому у меня нездоровый интерес как раз),
Notification вообще не выводится.
???
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38295564
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77
Код: vbnet
1.
2.
  hBalloonIcon As Long
End Type


Нигде не ошибся?
При наличии последнего элемента hBalloonIcon As Long (к которому у меня нездоровый интерес как раз),
Notification вообще не выводится.
???

Короче нигде я в структуре не ошибся.
Но сделал 2 других ошибки.

1. Я поленился сделать иконку 32 размера, наивно полагая что моя 48 "отформатируется автоматически".
С NIIF_USER+ .hIcon этот фокус проходит, а с .hBalloonIcon -не проходит
Т.е. по хорошему надо делать вообще так (если хочу большую иконку):

Код: vbnet
1.
2.
3.
4.
5.
6.
  lngIconTime32 = LoadImage(App.hInstance, MAKEINTRESOURCE(303), IMAGE_ICON, _
   GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR)

  .dwInfoFlags = NIIF_USER Or NIIF_LARGE_ICON

  .hBalloonIcon = lngIconTime32 



Ну а если устраивает маленькая, то делать ее 16х16 (ну или через метрики) и убирать NIIF_LARGE_ICON.
Т.е. эта фича вольностей не прощает.

2. Ну и тупо ошибся с константой
Увидел x000020 и забабахал NIIF_LARGE_ICON = &H14 (=20 надо ж было так лохануться)
Естественно огреб кучу глюков.
А правильно
Код: vbnet
1.
Public Const NIIF_LARGE_ICON = &H20



На XP видимо придется довольствоваться стандартными восклицательными знаками,
ну а на Вистах можно выводить 32-е иконки на вкус и цвет.

Т.е. правильный код примерно такой:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Private Sub CommandBallon3_Click()
  Dim nid As NOTIFYICONDATA
  With nid 'вывов уведомления в трей
    .cbSize = IIf(IsWinVista, Len(nid), NOTIFYICONDATA_V3_SIZE)
    .hwnd = Me.hwnd 'Handle to parent window
    .uID = vbNull  'Id of the icon
    .uFlags = NIF_INFO 'Options: show balloon
    .dwInfoFlags = IIf(IsWinVista, NIIF_USER Or NIIF_LARGE_ICON, NIIF_INFO)
    .uTimeoutAndVersion = 10000 'Timeout when the balloon dissapear
    .szInfo = "Message small font" & Chr(0) 'Message
    .szInfoTitle = "Title large font" & Chr(0) 'Title
    If IsWinVista Then .hBalloonIcon = lngIconTime32
  End With
  Shell_NotifyIcon NIM_MODIFY, nid 'Show balloon
End Sub


Т.е. я на XP обрезаю структуру и вывожу стандартный восклицательный знак NIIF_INFO
А на вистах я использую полную структуру и большую картинку, которую произвольно задаю в hBalloonIcon
Так что все работает с этим.
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38295566
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати еще один недостаток системной очереди.
Если я использую разные .hBalloonIcon и понапихал несколько сообщений в
системную очередь, наивно полагая что картинки будут разные,
я получу последний .hBalloonIcon во всех сообщениях.
Опять же в пользу того, чтобы очередь контролировалась внутри приложения.
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38642864
ДамирШ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,
пытаюсь запустить Ваш в код в средах компилирующих VB. Однако, получаю ошибки. Конечная цель - организовать уведомление в облаке. Как именно это сделать?
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38642869
ДамирШ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

в довершение предыдущему...
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38642871
ДамирШ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДамирШ,
не пойму как определить NOTIFYICONDATA. как объект или как то еще?
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38642873
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДамирШне пойму как определить NOTIFYICONDATA. как объект или как то еще?определение типа нахоится в предыдущем постеДамирШв средах компилирующих VBможно уточнить, что это за среды такие?
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38642890
ДамирШ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
прошу ссылку на предыдущий пост. Может я просто не вижу.


запускал в Visual Studio, а также в TDMS - программа воспринимающая vb - программа для организации документооборота (не среда программирования, но понимает код vb)
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38642901
ДамирШ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
прошу помочь в реализации простого уведомления в облаке трея на vb
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38642912
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДамирШпрошу ссылку на предыдущий постЕсть волшебное сочетание кнопок в браузере - Ctrl+F. Нажимаете - и можно найти какое-то слово на странице.
ДамирШзапускал в Visual Studioв какой?
ДамирШа также в TDMSв TDMS, насколько я понимаю, VBScript используется в качестве языка программирования...
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38642919
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДамирШ,

Я честно не понимаю чего ты хочешь.
Что такое "облако трея"?
Что такое "уведомления в облаке трея"?
В данной теме рассмотрено по сути 2 вопроса.
1) Tray Notifications (уведомление типа ballon в иконку рядом с часами)
2) Логика организации своей очереди для этих уведомлений (не использующая логику очереди из msdn).
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38643910
ДамирШ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

1. Уведомление в облаке Balloon в трее возле часов.
2. Нужен вызов этого уведомления Tray Notifications в требуемым текстом из внешнего приложения, желательно на vb. Либо на крайний случай запуск приложению программу, которая и отвечает за вызов уведомления.
...
Рейтинг: 0 / 0
Хочу понять логику "уведомлений в трей".
    #38644674
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДамирШ1. Уведомление в облаке Balloon в трее возле часов..
Если ты хочешь чтобы Ballon вырастал из иконки "чужого" приложения, то здесь у тебя боюсь ничего не выйдет.

Пишется свое приложение.
Грубо Form1,
твое приложение размещает иконку в трее через NOTIFYICONDATA.
твое приложение дает команду отобразить Ballon через эту иконку опять же через NOTIFYICONDATA

ДамирШ2. Нужен вызов этого уведомления Tray Notifications в требуемым текстом из внешнего приложения, желательно на vb. Либо на крайний случай запуск приложению программу, которая и отвечает за вызов уведомления.
Ну, как вариант, можешь использовать отдельное приложение для трей-иконки.
А другие например посылают ему команды отображения сообщений через IPC: к примеру SendMessage(WM_COPYDATA) или MailSlot. MailSlot кстати очень удобен, т.к. не привязан к аккаунту пользователя.
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Хочу понять логику "уведомлений в трей".
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]