purebasic.info

PureBasic forum
Текущее время: Пн дек 17, 2018 5:55 pm

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




Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Re: Соответствие #PB_Event_SysTray в API
СообщениеДобавлено: Вт апр 10, 2018 11:59 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11336
Благодарил (а): 4 раз.
Поблагодарили: 443 раз.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Procedure WinCallback(hWnd.i, uMsg.i, wParam.i, lParam.i)
  Static x=#False
  If uMsg = 12501 And wParam = 1
    Select lParam
      Case #WM_RBUTTONDOWN, #WM_RBUTTONDBLCLK
        x=#True
      Case #WM_RBUTTONUP
        If x=#True
          x=#False
          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 8:14 pm 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 273
Благодарил (а): 14 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
newJS писал(а):
как шаманил? :D
Исключительно в демо :|
Код:
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
Structure RECT
  left.i
  top.i
  right.i
  bottom.i
EndStructure
Global rec.RECT
 
Structure POINT
  x.l
  y.l
EndStructure
Global p.POINT
 
Procedure WinCallback(hWnd.i, uMsg.i, wParam.i, lParam.i)
  Protected TrayWnd.i, NotifyWnd.i, SysPager.i, Window32.i
  If uMsg = 12501 And wParam = 1
    Select lParam
      Case 513
        TrayWnd = FindWindow_(@"Shell_TrayWnd", 0)
        NotifyWnd = FindWindowEx_(TrayWnd, 0, @"TrayNotifyWnd", 0)
        SysPager = FindWindowEx_(NotifyWnd, 0, @"SysPager", 0)
        Window32 = FindWindowEx_(SysPager, 0, @"ToolbarWindow32", 0)
        GetWindowRect_(Window32, @rec)
        rec\right = rec\left + (rec\bottom - rec\top)
      Case 514
        GetCursorPos_(@p)
        If p\x > rec\left And p\x < rec\right And p\y > rec\top And p\y < rec\bottom
          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


Ах да, малость не забыл, новая иконка (которая появится после сего "кода") немного изменит ход событий, но... :roll:


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

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

repeat писал(а):
Исключительно в демо :|

тогда понятно


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

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

repeat, теперь работает почти как должно, остался маленький косяк
если нажать на панели задач, а отпустить на иконке, то будет клик, но это экзотический вариант, так что это рабочий вариант
как то по другому спровоцировать клик не удалось

спасибо


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

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


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

Зарегистрирован: Пн мар 26, 2018 9:09 pm
Сообщений: 40
Благодарил (а): 0 раз.
Поблагодарили: 6 раз.
Пункты репутации: 0
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Procedure WinCallback(hWnd.i, uMsg.i, wParam.i, lParam.i)
  If uMsg = 12501 And  wParam = 1 And lParam=514
    Debug "Клик"
  EndIf
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
 
 
OpenWindow(0, 0, 0, 200, 200, "", #PB_Window_SystemMenu|1)
SetWindowCallback(@WinCallback(),0)
AddSysTrayIcon(1, WindowID(0), LoadIcon_(0, 32512))
Repeat
  Event.i = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
End



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

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


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

Зарегистрирован: Пн мар 26, 2018 9:09 pm
Сообщений: 40
Благодарил (а): 0 раз.
Поблагодарили: 6 раз.
Пункты репутации: 0
Цитата:
косяк, нажал отпустил в разных местах, будет клик

Не подтверждается. Доказательства в студию.
По крайней мере смоделировать не удалось.
Возможно Вы используете какие-либо balloons, tooltips. С ними не проверялось.


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

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

как сей код ловит само нажатие? если это дело не заложено в код?
в коде только отпускание мыши, вот оно и срабатывает, #WM_LBUTTONUP = 514
If uMsg = 12501 And wParam = 1 And lParam=514 а первые два параметра описаны в самом начале темы Петром

есть смысл пересмотреть коды которые выкладывал repeat, хорошо прослеживается как он медленно подходил к правильному коду


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

Зарегистрирован: Пн мар 26, 2018 9:09 pm
Сообщений: 40
Благодарил (а): 0 раз.
Поблагодарили: 6 раз.
Пункты репутации: 0
Экзотические случаи описаны.
Вариант 1:
Цитата:
нажимаешь мышу на пустом месте панели задач, тянешь её на иконку, отпускаешь, есть клик

Удалось смоделировать с трудом. Если открыты все значки на панели задач, то найти пустое место удалось только под/над индикатором раскладки клавиатуры. Действительно, если нажать ЛКМ и перетащить курсор на нашу иконку клик моделируется. Когда иконки свернуты в отдельную область перемещение курсора с пустого места на иконку не вызывает клика.

Цитата:
нажимаешь мышу на иконке, отводишь в любое место окна, есть клик

Нажатие ЛКМ на иконке и попытка перемещения в другое место вызывает захват иконки (drag&drop) и клика возникать не должно.
Вот еще код с запоминанием предыдущего события и сравнения с текущим. Когда генерируется #WM_LBUTTONDOWN, то за ним должно быть сгененрировано #WM_LBUTTONUP
Код:
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
Structure pcb
  p1.i
  p2.i
  p3.i
EndStructure
 
Global pcb.pcb
 
Procedure WinCallback(hWnd.i, uMsg.i, wParam.i, lParam.i)
  If uMsg=12501 And wParam=1 And lParam=514
    If pcb\p1=12501 And  pcb\p2=1 And  (pcb\p3=513 Or pcb\p3=512)
      Debug "CLICK"
    EndIf
  EndIf
  pcb\p1=uMsg: pcb\p2=wParam: pcb\p3=lParam
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
 
 
OpenWindow(0, 0, 0, 400, 200, "", #PB_Window_SystemMenu|1)
SetWindowCallback(@WinCallback(),0)
AddSysTrayIcon(1, WindowID(0), LoadIcon_(0, 32512))
Repeat
  Event.i = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
End



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

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 712
Благодарил (а): 75 раз.
Поблагодарили: 21 раз.
Пункты репутации: 5
Piter писал(а):
Нажатие ЛКМ на иконке и попытка перемещения в другое место вызывает захват иконки (drag&drop) и клика возникать не должно.

не вызывает, по логике не должно вызывать, это нужно чтобы была возможность анулировать ошибочное нажатие уведя мышу и отпустив её на свободном месте
клик и дубльклик должны лоцироваться на одном элементе, иначе это уже не клики, а случайные нажатия которые должны игнириться
вчера наткнулся
Цитата:
int WINAPI GetSystemMetrics(int nIndex);
SM_CXDOUBLECLK
Ширина прямоугольника, внутри которого должны быть сделаны два щелчка мышью, для того чтобы они могли распознаваться как один двойной щелчок (double click). Эта константа определена только для Windows версии 3.1


Piter писал(а):
Экзотические случаи описаны

это не экзотика, так должно быть


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

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 273
Благодарил (а): 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
Structure POINT
  x.i
  y.i
EndStructure
 
#PROCESS_ALL_ACCESS = $1F0FFF
#MEM_COMMIT = $00001000
#PAGE_READWRITE = $04
#MEM_RELEASE = $8000
#TB_HITTEST = 1024+69
 
Procedure WinCallback(hWnd.i, uMsg.i, wParam.i, lParam.i)
  Protected p.POINT
  Protected.i TrayWnd, NotifyWnd, SysPager, Window32, hProcess, Pid, Virtual, Count
  Static.i ClikStart
  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)
        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)
        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 ClikStop = ClikStart
          Debug "Клик"
        EndIf  
        ClikStart = -1
        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



Последний раз редактировалось repeat Пн апр 16, 2018 4:33 pm, всего редактировалось 1 раз.

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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11336
Благодарил (а): 4 раз.
Поблагодарили: 443 раз.
Из-за этого кода проводник вылетает.

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


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

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 273
Благодарил (а): 14 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
Win XP SP3, PB 5.62 Demo. Работает стабильно. :?

Ага, один разок подвисло, поправил код.


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

Зарегистрирован: Пн мар 26, 2018 9:09 pm
Сообщений: 40
Благодарил (а): 0 раз.
Поблагодарили: 6 раз.
Пункты репутации: 0
Использование GetCursorPos для SysTray нехорошая идея. Дело в том, что SysTray , в отличие от рабочего стола, динамически изменяющаяся область где могут в любой момент появиться сообщения от системы (изменив количество иконок и их расположение) или он может свернуться в компактный режим и позиция иконки изменится. Поймать ее не удастся.


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

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


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

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


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

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