purebasic.info

PureBasic forum
Текущее время: Пн июн 18, 2018 8:43 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
СообщениеДобавлено: Вт авг 23, 2016 6:15 am 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Вс июл 14, 2013 10:04 pm
Сообщений: 30
Откуда: Новосибирск
Благодарил (а): 14 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Захотелось добавить в своей приложке (которое висит иконкой в трее) уведомления в виде всплывающих сообщений. На просторах данного форума был даже найден готовый код, казалось бы - бери да используй (http://purebasic.info/phpBB3ex/viewtopic.php?f=1&t=132&p=7960&hilit=Shell_NotifyIcon#p7960):
Код:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
Structure NOTIFYICONDATA_
cbSize.l
hwnd.i
uId.l
uFlags.l
uCallbackMessage.l
hIcon.i
StructureUnion
szTip.c[64]
szTipEx.c[128]
EndStructureUnion
dwState.l
dwStateMask.l
szInfo.c[256]
StructureUnion
uTimeout.l
uVersion.l
EndStructureUnion
szInfoTitle.c[64]
dwInfoFlags.l
guidItem.GUID
hBalloonIcon.i
EndStructure
 
Enumeration
#NOTIFYICONDATA_V1_SIZE = 88
#NOTIFYICONDATA_V2_SIZE = 488
#NOTIFYICONDATA_V3_SIZE = 504
#NOTIFYICONDATA_V4_SIZE = 508
EndEnumeration
 
Procedure SysTrayIconBalloon_(uId, hWindow, Title$, Message$, timeOut, flags)
Protected nId.NOTIFYICONDATA_
If OSVersion() >= #PB_OS_Windows_Vista
nId\cbSize = #NOTIFYICONDATA_V4_SIZE
ElseIf OSVersion() >= #PB_OS_Windows_XP
nId\cbSize = #NOTIFYICONDATA_V3_SIZE
ElseIf OSVersion() >= #PB_OS_Windows_2000
nId\cbSize = #NOTIFYICONDATA_V2_SIZE
Else
nId\cbSize = #NOTIFYICONDATA_V1_SIZE
EndIf
If nId\cbSize
nId\uVersion = 4
Shell_NotifyIcon_(#NIM_SETVERSION, @nId)
nId\uId = uId
nId\hwnd = hWindow
nId\dwInfoFlags = flags
nId\uFlags = #NIF_INFO
nId\uTimeout = timeOut
PokeS(@nId\szInfo, Message$, SizeOf(nId\szInfo))
PokeS(@nId\szInfoTitle, Title$, SizeOf(nId\szInfoTitle))
ProcedureReturn Shell_NotifyIcon_(#NIM_MODIFY, @nId)
EndIf
ProcedureReturn #False
EndProcedure
 
Procedure SysTrayIconToolTip_(uId, hWindow, Tip$)
Protected nId.NOTIFYICONDATA_
If OSVersion() >= #PB_OS_Windows_Vista
nId\cbSize = #NOTIFYICONDATA_V4_SIZE
ElseIf OSVersion() >= #PB_OS_Windows_XP
nId\cbSize = #NOTIFYICONDATA_V3_SIZE
ElseIf OSVersion() >= #PB_OS_Windows_2000
nId\cbSize = #NOTIFYICONDATA_V2_SIZE
Else
nId\cbSize = #NOTIFYICONDATA_V1_SIZE
EndIf
If nId\cbSize
nId\uVersion = 4
Shell_NotifyIcon_(#NIM_SETVERSION, @nId)
nId\uId = uId
nId\hwnd = hWindow
nId\uFlags = #NIF_TIP
PokeS(@nId\szTip, Tip$, SizeOf(nId\szTip)+SizeOf(nId\szTipEx))
EndIf
ProcedureReturn Shell_NotifyIcon_(#NIM_MODIFY, @nId)
EndProcedure
 
 
If OpenWindow(0, 100, 150, 270, 320, "Менеджер налоговых программ", #PB_Window_MinimizeGadget)
 
AddSysTrayIcon(1, WindowID(0), LoadImage(0, "Data\data"))
 
SysTrayIconBalloon_(1, WindowID(0), "заголовок сообщения", "длинный длинный текст", 5000, 0)
 
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Q=1
EndSelect
 
Until Q=1
 
EndIf
End


но увы, он никак не хотел работать. Попробовал с нуля по документации к Shell_NotifyIcon (https://msdn.microsoft.com/en-us/library/windows/desktop/bb762159(v=vs.85).aspx) - результат аналогичный. Пока я из любопытства не отключил компиляцию в юникоде. После этого всё заработало как надо!

Пока, в качестве решения проблемы импортирую именно не юникодную функцию Shell_NotifyIcon из Shell32.lib
Код:
1
2
3
Import "Shell32.lib"
  Shell_NotifyIconA(dwMessage, lpdata)                          
EndImport


А при использовании PokeS задаю флаг #PB_Ascii.

Как вы думаете, в чём может быть проблема? Одним из предположений было то, что используемые в структуре типы переменных Integer и Character при компиляции в юникод перестают соответствовать тому размеру, который ожидает увидеть Shell_NotifyIcon в структуре NOTIFYICONDATA, однако замена этих типов на Long и Ascii соответственно эффекта не возымела. :(

_________________
Ms Windows 7 SP1 (x64) | Linux Kubuntu 14.04 (x86) | PureBasic 5.30 (x86)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт авг 23, 2016 11:02 am 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1623
Откуда: Алматы
Благодарил (а): 13 раз.
Поблагодарили: 44 раз.
Пункты репутации: 5
о... походу как раз мой вопрос и был :) если бы ты дальше пролистал ответы - там думаю был бы ответ Петра на эту тему :)

правда я уже тоже не помню что там Петр отвечал, и возможно мой код будет несколько обрезан...
Код:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
;{ структуры для систем трей иконки
Structure NOTIFYICONDATA_95
  cbSize.l
  hwnd.l
  uID.l
  uFlags.l
  uCallbackMessage.l
  hIcon.l
  szTip.c[64]
EndStructure
Structure NOTIFYICONDATA_2K Extends NOTIFYICONDATA_95
  szTipEx.c[64]
  dwState.l
  dwStateMask.l
  szInfo.c[256]
  StructureUnion
  uTimeout.l
  uVersion.l
  EndStructureUnion
  szInfoTitle.c[64]
  dwInfoFlags.l
EndStructure
Structure NOTIFYICONDATA_XP Extends NOTIFYICONDATA_2K
   guid.GUID
EndStructure
;}
 
;{ процедура построения уведомления в систем трее юникод
Procedure SysTrayIcon_Balloon(Tray, WindowID, Title.s, Message.s, TimeOut, TypeIcon)
; Tray     - идентификатор значка в трее
; WindowID - Системный идентификатор окна
; Title    - текст в заголовке баллона
; Message  - текст в баллоне
; TimeOut  - Время (в миллисекундах) отображения баллона
; TypeIcon - тип значка #NIIF_NONE #NIIF_INFO #NIIF_WARNING #NIIF_ERROR #NIIF_USER
 
  Protected nid.NOTIFYICONDATA_2K
  nid\cbSize      = SizeOf(NOTIFYICONDATA_2K)
  nid\uVersion = #NOTIFYICON_VERSION
  Shell_NotifyIcon_(#NIM_SETVERSION, @nid)
  nid\uCallbackMessage=#PB_Event_SysTray
  nid\uID         = Tray
  nid\hwnd        = WindowID
  nid\dwInfoFlags = TypeIcon;#NIIF_INFO
  nid\uFlags      = #NIF_INFO
  nid\uTimeout    = TimeOut
  nid\dwState = #NIS_SHAREDICON
  PokeS(@nid\szInfo, message, 256)
  PokeS(@nid\szInfoTitle, title, 64)
 
  ProcedureReturn Shell_NotifyIcon_(#NIM_MODIFY, @nid)
 
EndProcedure
;}
 
 
If OpenWindow(0, 100, 150, 270, 320, "Менеджер налоговых программ", #PB_Window_MinimizeGadget)
 
AddSysTrayIcon(1, WindowID(0), LoadImage(0, "C:\Program Files\PureBasic5.31\Examples\Sources\Data\CdPlayer.ico"))
 
SysTrayIcon_Balloon(1, WindowID(0), "заголовок сообщения", "длинный длинный текст", 5000, 0)
 
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Q=1
EndSelect
 
Until Q=1
 
EndIf
End
 



путь до иконки надо изменить :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср авг 24, 2016 4:50 am 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Вс июл 14, 2013 10:04 pm
Сообщений: 30
Откуда: Новосибирск
Благодарил (а): 14 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
SereZa писал(а):
о... походу как раз мой вопрос и был :) если бы ты дальше пролистал ответы - там думаю был бы ответ Петра на эту тему :)


Видимо невнимательно пролистал - не заметил %)

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


Отлично! Работает как надо, большое спасибо! :D

_________________
Ms Windows 7 SP1 (x64) | Linux Kubuntu 14.04 (x86) | PureBasic 5.30 (x86)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB