purebasic.info

PureBasic forum
Текущее время: Вт окт 23, 2018 11:46 pm

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




Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Соответствие #PB_Event_SysTray в API
СообщениеДобавлено: Пн апр 02, 2018 9:52 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 684
Благодарил (а): 75 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
окно создаётся CreateWindowEx_(), создаётся иконка в трее AddSysTrayIcon(), а как мышу поймать на этой иконке, не понял
все события ловятся в WindowCallback(), нужна виндовая константа


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Соответствие #PB_Event_SysTray в API
СообщениеДобавлено: Пн апр 02, 2018 11:35 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11304
Благодарил (а): 4 раз.
Поблагодарили: 438 раз.
Окну отсылается сообщение 12501. В wParam будет идентификатор значка в трее, а в lParam сообщение, например #WM_RBUTTONUP.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Соответствие #PB_Event_SysTray в API
СообщениеДобавлено: Ср апр 04, 2018 5:18 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 684
Благодарил (а): 75 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
Пётр, спасибо, но как саму константу звать?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Соответствие #PB_Event_SysTray в API
СообщениеДобавлено: Ср апр 04, 2018 10:43 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11304
Благодарил (а): 4 раз.
Поблагодарили: 438 раз.
В PB константы с таким значением нет.
Оно выбирается при создании значка в трее, при заполнении структуры NOTIFYICONDATA (поле uCallbackMessage). В библиотеке SysTray PB оно такое.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Соответствие #PB_Event_SysTray в API
СообщениеДобавлено: Чт апр 05, 2018 7:01 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 684
Благодарил (а): 75 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
спасибо, посмотрим что за структура, а то у меня wParam вечный ноль
а в общем с меню всё получилось, заработало
Код:
1
2
3
4
5
6
Case 12501
If lParam=#WM_RBUTTONUP ; wParam=tray And ; тут вечный ноль
DisplayPopupMenu(320, hWndmain)
EndIf
Case #WM_COMMAND ; в wParam индекс пункта который задан при создании меню
If wParam=11:DestroyWindow_(Window):EndIf



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Соответствие #PB_Event_SysTray в API
СообщениеДобавлено: Чт апр 05, 2018 10:02 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11304
Благодарил (а): 4 раз.
Поблагодарили: 438 раз.
newJS писал(а):
у меня wParam вечный ноль
Наверное потому что в функции AddSysTrayIcon первым аргументом был 0.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Соответствие #PB_Event_SysTray в API
СообщениеДобавлено: Пт апр 06, 2018 7:43 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 684
Благодарил (а): 75 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
ну да, там ноль, но это ж внутренний номер ПБ, я то ждал API номер, то что вернула tray=AddSysTrayIcon(0, hWndMain.....


в API не нахожу константы клика, нажал/отпустил это не то, это два отдельных события, на самом деле всё сложней, как этот клик правильно организовать? в данном случае ПБ события не котируются, все события ловятся в WindowCallback(), это API часы из примеров, делаю из примера нормальную программу

------
нашёл по русски про NOTIFYICONDATA на сайте, может кому по русски более понятней
Код:
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
 Q4: Как добавить иконку на Tray ?
A4: Для  работы  с  SystemTray  существует всего одна функция. Вот ее
     Си-прототип:
       WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
                               DWORD dwMessage,      // message identifier
                               PNOTIFYICONDATA pnid  // pointer to structure
                                               );
     Эта  функция описана в заголовочном файле Win32-SDK "shellapi.h",
     включаемом   в  программу  при  включении  "windows.h".  Параметр
     dwMessage   может  принимать  одно  из  трех  значений:  NIM_ADD,
     NIM_DELETE,  NIM_MODIFY.  Для  добавления  иконки  он должен быть
     установлен в NIM_ADD.
       Параметр pnid имеет тип PNOTIFYDATA, который описан как:
       typedef struct _NOTIFYICONDATA { // nid
                                       DWORD cbSize;
                                       HWND hWnd;
                                       UINT uID;
                                       UINT uFlags;
                                       UINT uCallbackMessage;
                                       HICON hIcon;
                                       char szTip[64];
                                      } NOTIFYICONDATA, *PNOTIFYICONDATA;
     Поля структуры NOTIFYICONDATA имеют следующий смысл:
         cbSize          - размер структуры, должен быть
                           sizeof(NOTIFYICONDATA).
         hWnd            - дескриптор окна, которое будет получать события
                           мыши над иконкой.
         uID             - уникальный идентификатор иконки. Идентификатор
                           должен быть уникален в пределах окна - обрабо-
                           тчика, передаваемого в hWnd.
         uFlags          - битовое поле, определяющее какое из следующих
                           полей несет действительную информацию.
                           Может быть одним из следующих значений: NIF_ICON,
                           NIF_MESSAGE, NIF_TIP или их OR-комбинацией.
        uCallbackMessage - сообщение, передаваемое окну - обработчику при
                           событиях мыши. Желательно получать номер
                           сообщения вызовом RegisterWindowMessage(),
                           но допускаются и значения WM_USER+N, где N > 0.
        hIcon            - дескриптор иконки, помещаемой на Tray.
        szTip            - текст для ToolTip'а, если szTip[0] = 0x00, то
                          ToolTip'а не будет.
     Таким   образом,   для   добавления  иконки  на  Tray  необходимо
     заполнить  экземпляр  структуры  NOTIFYICONDATA и вызвать функцию
     Shell_NotifyIcon()   с   параметром   NIM_ADD   и  указателем  на
     заполненный экземпляр структуры.
       При  добавлении  иконки необходимо заполнить поля cbSize, hWnd,
     uID,  uFlags,  uCallbackMessage, hIcon. Поле szTip можно оставить
     пустым,  если  вам не нужен ToolTip. Поле uFlags должно содержать
     как минимум NIF_MESSAGE | NIF_ICON.



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Соответствие #PB_Event_SysTray в API
СообщениеДобавлено: Пт апр 06, 2018 3:55 pm 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 271
Благодарил (а): 14 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
Код:
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
Structure GUID 
  Data1.l
  Data2.w
  Data3.w
  Data4.b [8]
EndStructure
 
Structure NOTIFYICONDATA
  cbSize.l
  hwnd.i
  uId.l
  uFlags.l
  uCallbackMessage.l
  hIcon.i
  StructureUnion
    szTip.s {64}
    szTipEx.s {128}
  EndStructureUnion
  dwState.l
  dwStateMask.l
  szInfo.s {256}
  StructureUnion
    uTimeout.l
    uVersion.l
  EndStructureUnion
  szInfoTitle.s {64}
  dwInfoFlags.l
  guidItem.GUID
  hBalloonIcon.i
EndStructure
Global lpdata.NOTIFYICONDATA
lpdata\cbSize = SizeOf(NOTIFYICONDATA)
 
Procedure WinCallback(hWnd.i, uMsg.i, wParam.i, lParam.i)
  If uMsg = 123
    Select lParam
      Case 513
        Debug "1 клик левой кнопкой мыши"
      Case 515
        Debug "2 клика левой кнопкой мыши"
      Case 516
        Debug "1 клик правой кнопкой мыши"
        ; и т.д.
    EndSelect
  EndIf
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
 
OpenWindow(0, 0, 0, 200, 200, "", #PB_Window_SystemMenu|1)
SetWindowCallback(@WinCallback())
 
lpdata\hwnd = WindowID(0)
lpdata\uId = 0
lpdata\uFlags = $00000001|$00000002|$00000004
lpdata\uCallbackMessage = 123
lpdata\hIcon = LoadIcon_(0, 32512)
lpdata\szTip = "Text"
Shell_NotifyIcon_(0, @lpdata)
 
Repeat
  Event.i = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
End

или с AddSysTrayIcon
Код:
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
Procedure WinCallback(hWnd.i, uMsg.i, wParam.i, lParam.i)
  If uMsg = 12501
    Select lParam
      Case 513
        Debug "1 клик левой кнопкой мыши"
      Case 514
        Debug "левая кнопка мыши отпущена"
      Case 515
        Debug "2 клика левой кнопкой мыши"
      Case 516
        Debug "1 клик правой кнопкой мыши"
      Case 517
        Debug "правая кнопка мыши отпущена"
        ; и т.д.
    EndSelect
  EndIf
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
 
OpenWindow(0, 0, 0, 200, 200, "", #PB_Window_SystemMenu|1)
SetWindowCallback(@WinCallback())
AddSysTrayIcon(0, WindowID(0), LoadIcon_(0, 32512))
Repeat
  Event.i = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
End

или с двумя AddSysTrayIcon
Код:
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
Procedure WinCallback(hWnd.i, uMsg.i, wParam.i, lParam.i)
  If uMsg = 12501 And wParam = 1
    Select lParam
      Case 513
        Debug "1 клик левой кнопкой мыши Icon = 1"
      Case 514
        Debug "левая кнопка мыши отпущена Icon = 1"
      Case 515
        Debug "2 клика левой кнопкой мыши Icon = 1"
      Case 516
        Debug "1 клик правой кнопкой мыши Icon = 1"
      Case 517
        Debug "правая кнопка мыши отпущена Icon = 1"
        ; и т.д.
    EndSelect
  ElseIf wParam = 2
    Select lParam
      Case 513
        Debug "1 клик левой кнопкой мыши Icon = 2"
      Case 514
        Debug "левая кнопка мыши отпущена Icon = 2"
      Case 515
        Debug "2 клика левой кнопкой мыши Icon = 2"
      Case 516
        Debug "1 клик правой кнопкой мыши Icon = 2"
      Case 517
        Debug "правая кнопка мыши отпущена Icon = 2"
        ; и т.д.
    EndSelect
  EndIf
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
 
OpenWindow(0, 0, 0, 200, 200, "", #PB_Window_SystemMenu|1)
SetWindowCallback(@WinCallback())
AddSysTrayIcon(1, WindowID(0), LoadIcon_(0, 32512))
AddSysTrayIcon(2, WindowID(0), LoadIcon_(0, 32512))
Repeat
  Event.i = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
End

или я вообще не в тему :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Соответствие #PB_Event_SysTray в API
СообщениеДобавлено: Сб апр 07, 2018 6:29 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 684
Благодарил (а): 75 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
repeat, спасибо, сёдня попробую


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Соответствие #PB_Event_SysTray в API
СообщениеДобавлено: Вс апр 08, 2018 6:50 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 684
Благодарил (а): 75 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
repeat, а где клик? это всё константы которые есть, посмотри константы в РВ


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Соответствие #PB_Event_SysTray в API
СообщениеДобавлено: Вс апр 08, 2018 11:08 pm 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 271
Благодарил (а): 14 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
newJS писал(а):
а где клик?
Клик - в смысле кнопка нажата.
На комментарии к коду особо смотреть не нужно :)
Нужен такой клик - NM_CLICK = -2, NM_RCLICK = -5 ? Только они приходят в WM_NOTIFY (NMHDR).
Не знаю, видимо нет у SysTray события типа NM_CLICK. И NM_CLICK это же пара нажал/отпустил, просто WM_NOTIFY не получает WM_LBUTTONUPнаверное туговато объясняю, короче как-то так: нажал - действие, отпустил - нет действия потому, что WM_LBUTTONUP относится к нажатию и после того как отправилось NM_CLICK, WM_LBUTTONUP не может числится как отдельное событие:) Если я ошибаюсь, поправьте.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Соответствие #PB_Event_SysTray в API
СообщениеДобавлено: Пн апр 09, 2018 4:01 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 684
Благодарил (а): 75 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
repeat писал(а):
Клик - в смысле кнопка нажата.
NM_CLICK это же пара нажал/отпустил

клик это
нажал мышу, пошла проверка где нажал
отпустил мышу, пошла проверка где отпустил
если нажал / отпустил на одном элементе, это клик, иначе это два разных (отдельных) события, время между нажал и отпустил роли не играет
ты сам вспомни, нажал кнопку, понял что погорячился, увёл мышу на пустое место, отпустил, ни чего не произошло, потому что не клик, а два разных события получилось
repeat писал(а):
Не знаю, видимо нет у SysTray события типа NM_CLICK

как то это сделали
#PB_EventType_RightClick
#PB_EventType_LeftClick


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Соответствие #PB_Event_SysTray в API
СообщениеДобавлено: Пн апр 09, 2018 7:47 am 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 271
Благодарил (а): 14 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
newJS писал(а):
клик это
Ааа, ясно, да, проблемно. :? Ну, на крайний случай:
Код:
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
Structure POINT
  x.l
  y.l
EndStructure
Global p.POINT
 
Procedure WinCallback(hWnd.i, uMsg.i, wParam.i, lParam.i)
  Protected st.POINT
  If uMsg = 12501 And wParam = 1
    Select lParam
      Case 513
        GetCursorPos_(@p)
      Case 514
        GetCursorPos_(@st)
        If p\x = st\x And p\y = st\y
          Debug "Клик"
        EndIf
    EndSelect
  EndIf
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
 
 
OpenWindow(0, 0, 0, 200, 200, "", #PB_Window_SystemMenu|1)
SetWindowCallback(@WinCallback())
AddSysTrayIcon(1, WindowID(0), LoadIcon_(0, 32512))
Repeat
  Event.i = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
End



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Соответствие #PB_Event_SysTray в API
СообщениеДобавлено: Вт апр 10, 2018 5:15 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 684
Благодарил (а): 75 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
спасибо, попробую


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Соответствие #PB_Event_SysTray в API
СообщениеДобавлено: Вт апр 10, 2018 8:45 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 684
Благодарил (а): 75 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
repeat , а ты свой код проверяешь?
вот раскажи, как ты умудрился вот это сделать?, как шаманил? :D
Код:
1
2
3
4
5
Structure POINT
  x.l
  y.l
EndStructure
Global p.POINT


если это исправить, то код работает, но с одним недостатком, сдвиг мыши на пиксель и клика нет, хотя мыша и осталась на иконке
но это лучше чем ни чего, уже можно использовать с оговорками
как проверить что мыша на иконке если иконка в трее это не окно и оконные функции игнорят эту иконку?


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

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


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

Сейчас этот форум просматривают: Bing [Bot] и гости: 7


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

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