purebasic.info

PureBasic forum
Текущее время: Ср сен 26, 2018 4:15 pm

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




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

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 271
Благодарил (а): 14 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
Piter я на авторское право не претендую, можете править мой код сколько душе угодно :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Соответствие #PB_Event_SysTray в API
СообщениеДобавлено: Пн апр 16, 2018 7:41 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
64
65
66
67
68
69
70
71
Structure POINT
  x.i
  y.i
EndStructure
 
#TB_BUTTONCOUNT = 1024+24
#PROCESS_ALL_ACCESS = $1F0FFF
#MEM_COMMIT = $00001000
#MEM_RELEASE = $8000
#TB_HITTEST = 1024+69
#PAGE_READWRITE = $04
 
Procedure WinCallback(hWnd.i, uMsg.i, wParam.i, lParam.i)
  Protected p.POINT
  Protected.i TrayWnd, NotifyWnd, SysPager, Window32, hProcess, Pid, Virtual, Count2
  Static.i ClikStart, Count1
  If uMsg = 12501 And wParam = 1
    Select lParam
      Case 513
        GetCursorPos_(@p)
        TrayWnd = FindWindow_(@"Shell_TrayWnd", 0)
        NotifyWnd = FindWindowEx_(TrayWnd, 0, @"TrayNotifyWnd", 0)
        SysPager = FindWindowEx_(NotifyWnd, 0, @"SysPager", 0)
        Window32 = FindWindowEx_(SysPager, 0, @"ToolbarWindow32", 0)
        ScreenToClient_(Window32, @p)
        Count1 = SendMessage_(Window32, #TB_BUTTONCOUNT, 0, 0)
        GetWindowThreadProcessId_(Window32, @Pid)
        hProcess = OpenProcess_(#PROCESS_ALL_ACCESS , #False, Pid)
        Virtual = VirtualAllocEx_(hProcess, 0, SizeOf(POINT), #MEM_COMMIT, #PAGE_READWRITE)
        WriteProcessMemory_(hProcess, @Virtual, @p, SizeOf(POINT), @dwBytesRead)
        ClikStart = SendMessage_(Window32, #TB_HITTEST , 0, @Virtual)
        VirtualFreeEx_(hProcess, Virtual, 0, #MEM_RELEASE)
        CloseHandle_(hProcess)
      Case 514
        GetCursorPos_(@p)
        TrayWnd = FindWindow_(@"Shell_TrayWnd", 0)
        NotifyWnd = FindWindowEx_(TrayWnd, 0, @"TrayNotifyWnd", 0)
        SysPager = FindWindowEx_(NotifyWnd, 0, @"SysPager", 0)
        Window32 = FindWindowEx_(SysPager, 0, @"ToolbarWindow32", 0)
        ScreenToClient_(Window32, @p)
        Count2 = SendMessage_(Window32, #TB_BUTTONCOUNT, 0, 0)
        GetWindowThreadProcessId_(Window32, @Pid)
        hProcess = OpenProcess_(#PROCESS_ALL_ACCESS , #False, Pid)
        Virtual = VirtualAllocEx_(hProcess, 0, SizeOf(POINT), #MEM_COMMIT, #PAGE_READWRITE)
        WriteProcessMemory_(hProcess, @Virtual, @p, SizeOf(POINT), @dwBytesRead)
        ClikStop = SendMessage_(Window32, #TB_HITTEST , 0, @Virtual)
       
        If Count2 > Count1
          ClikStart+(Count2-Count1)
        ElseIf Count2 < Count1
          ClikStart-(Count1-Count2)
        EndIf
       
        If ClikStop = ClikStart
          Debug "Клик"
        EndIf  
        ClikStart = -1: Count1 = 0
        VirtualFreeEx_(hProcess, Virtual, 0, #MEM_RELEASE)
        CloseHandle_(hProcess)
    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
СообщениеДобавлено: Пн апр 16, 2018 10:27 pm 
Не в сети
доцент

Зарегистрирован: Пн мар 26, 2018 9:09 pm
Сообщений: 40
Благодарил (а): 0 раз.
Поблагодарили: 6 раз.
Пункты репутации: 0
Проверил код из этого поста на Win7 и Win10. Если на Win7 иногда случались экзотические срабатывания, то на Win10 их вообще не удалось обнаружить. При нажатии ЛКМ на пустом пространстве хоть на desktop, хоть systray, перемещении курсора и отпускании на иконке клика не наблюдалось. При нажатии ЛКМ на иконке в systray она захватывается и следует за курсором. Отпускание ЛКМ не вызывало срабатываний нигде.


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

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 673
Благодарил (а): 75 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
Piter, последний код вообще не работает, совсем, ХР SP4 PB560
это не срабатывает
Код:
1
2
3
   If pcb\p1=12501 And  pcb\p2=1 And  (pcb\p3=513 Or pcb\p3=512)
      Debug "CLICK"
    EndIf



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

Зарегистрирован: Пн мар 26, 2018 9:09 pm
Сообщений: 40
Благодарил (а): 0 раз.
Поблагодарили: 6 раз.
Пункты репутации: 0
Нет возможности проверить в данный момент на XP (надо запускать машину почти двадцатилетней давности), но в 7 и 10 проверено.
Вот кодик для исследований событий над иконкой в трее. Можно посмотреть последовательность событий.
Код:
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
Enumeration #PB_Event_FirstCustomValue
  #CBEVENTMOUSE
EndEnumeration
 
Enumeration #PB_EventType_FirstCustomValue
  #CBEVENTMOUSETYPE
EndEnumeration
 
Global cntevnt.l=0
 
NewMap WM_ME.s()
WM_ME("512")="WM_MOUSEMOVE - мышиная возня"
 WM_ME("513")="WM_LBUTTONDOWN"
 WM_ME("514")="WM_LBUTTONUP"
 WM_ME("515")="WM_LBUTTONDBLCLK"
 WM_ME("516")="WM_RBUTTONDOWN"
 WM_ME("517")="WM_RBUTTONUP"
 WM_ME("518")="WM_RBUTTONDBLCLK"
 WM_ME("519")="WM_MBUTTONDOWN"
 WM_ME("520")="WM_MBUTTONUP"
 WM_ME("521")="WM_MBUTTONDBLCLK"
 
Procedure WinCallback(hWnd.i, uMsg.i, wParam.i, lParam.i)
  If uMsg=12501 And wParam=1
    If lParam>511 And lParam<522
      cntevnt=cntevnt+1
    PostEvent(#CBEVENTMOUSE,0,0,#CBEVENTMOUSETYPE,lParam)
    EndIf
  EndIf
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
 
Procedure AddItemList(gad,value.s)
  RemoveGadgetItem(gad, 0)
  AddGadgetItem (gad, -1,value)
EndProcedure  
 
OpenWindow(0, 0, 0, 400, 200, "", #PB_Window_SystemMenu|1)
SetWindowCallback(@WinCallback(),0)
AddSysTrayIcon(1, WindowID(0), LoadIcon_(0, 32512))
ListViewGadget(2,5,5,390,190)
For a = 1 To 10
      AddGadgetItem (2, -1, "Пусто " + Str(a))
    Next
    SetGadgetState(2, 9)
Repeat
  Event.i = WaitWindowEvent()
  Select Event
    Case #CBEVENTMOUSE
     postdata.i=EventData()
      AddItemList(2,Str(cntevnt)+". "+WM_ME(Str(postdata)))
  EndSelect    
Until Event = #PB_Event_CloseWindow
End


Хорошо видно, что кажущаяся пустая область вокруг иконки, таковой не является, а относится к самой иконке (areal). Может это и вводило в заблуждение.
Ещё интересные наблюдения для иконки в трее:
1. После нажатия на ЛКМ событие WM_LBUTTONDOWN не генерируется. Оно генерируется после отпускания совместно с WM_LBUTTONUP. Поэтому они нераздельны. Нажатие на иконке не отследить. Можно отследить только "клик".
2. Для ПКМ события генерируются отдельно. Поэтому там можно нажать (событие будет сгенерировано), отвести (будет MOVE), подвести и отпустить на иконке (событие будет сгенерировано).
Для XP возможно по другому. Надо исследовать.


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

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

похоже что так, семёрка и хрюндель ведут себя по разному
newJS писал(а):
Хорошо видно, что кажущаяся пустая область вокруг иконки, таковой не является, а относится к самой иконке (areal). Может это и вводило в заблуждение.

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


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

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


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

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


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

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