Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213

Menu tracking с помощью клавиатуры

11.05.2011, 12:57. Показов 1460. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я поставил иконку в трей.
При правом клике мышкой на него я открываю всплывающее меню.
Меню я создаю с помощью API функций CreatePopupMenu и AppendMenu.
Открываю с помощью TrackPopupMenuEx.

Проблема в том, что при открытии меню выбрать один из пунктов можно только с помощью мыши, клвиатура не работает.

Как мне добится того, чтобы можно было выбирать с помощью клвиш вверх/вниз?

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

Есть идеи почему это происходит ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.05.2011, 12:57
Ответы с готовыми решениями:

Управление координатами объектов с помощью клавиатуры
Всем привет, у меня проект , описывать я его не буду, но дело в том что мне нужно обеспечить передвижение некого объекта с помощью кнопок ...

Построить модель виртуальной клавиатуры с помощью графики
Суть такова: Взял задание для курсовой - Построить модель виртуальной клавиатуры с помощью графики(показалось довольно интересно). Но так...

Стал невозможным вход в BIOS, Boot Menu и в Безопасный режим с клавиатуры
После перехода с Win8 на Win10 у меня стало невозможным вход в BIOS, Boot Menu и в Безопасный режим с клавиатуры.

10
Comanche
11.05.2011, 13:04
Предлагаю сделать 2 вещи:
1. Перед вызовом меню:
Call SetForegroundWindow(strNID.hwnd)
Call PostMessage(strNID.hwnd, 0&, 0&, 0&)
(чтобы при щелчке 'мимо' popup-меню оно автоматически пряталось; здесь strNID - NOTIFYICONDATA-структура)
2. После выбора пункта меню, отвечающего за показ формы:
Call SetForegroundWindow(frmMain.hwnd)

Не уверен, но м.б. поможет...
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
12.05.2011, 18:37  [ТС]
Это решение помогло для меню, теперь и клавиатура работает и меню исчезает при нажатии вне меню.
Спасибо.

Однако осталась проблема с открытием формы.
Последовательность:
Я дважды нажимаю левую кнопку мыши на иконку в трее, или выбираю пункт меню 'открыть'.
Открывается моя форма.
Когда я веду мышь в окно, она по дороге проходит через границу Taskbar'а и курсор меняется на знак 'вертикального размера' (стрелки вверх и вниз). Этот курсор остается на моей форме.
Нажимаю на одну из кнопок на форме - курсор меняется на стандартный (в форме по крайней мере он такой), но нажатия на кнопку не присходит.
Нажимаю второй раз на кнопку - есть нажатие.

С этого момента форма реагирует как положенно, до следующего раза, когда она спрячется в трей и будет вызвана снова.
Как с этим справится ?
0
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
12.05.2011, 18:46  [ТС]
Извините, поправка.
Если я нажимаю на иконку в трее првой мышкой, открывается меню, если я выбираю 'открыть', то форма открывается и реагирует на события нормально.

Но, если я нажимаю на иконку левой мышкой дважды (на этом событии форма должна открыться), то тогда и появляется проблема описанная раньше.
0
Comanche
12.05.2011, 20:09
Нужен код твоего обработчика мышиных события 'трейной' иконки. Что-то там не так... ну не должен курсор 'застревать' в виде стрелок вверх/вниз!
Как ты создаёшь иконку, кстати? (АПИ или 'левый' контрол)
Как ты обрабатываешь события иконки - пишешь в структуру хэндл какого-нить 'ненужного' контрола?
Короче - код в студию! )
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
12.05.2011, 23:04  [ТС]
Я реализовал иконку как UserControl находящийся в моем проекте.
Этот контроль я устанавливаю на форму.

Код контроля:
Visual Basic
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
'____________________________________________________________________
'|
'|
'|
'|___________________________________________________________________
Option Explicit
 
'============= Tray Icon Constants and Declarations ================================
Private Type NOTIFYICONDATA
    cbSize As Long ' Size of this type.
    hWnd As Long   ' Handle to the window that will receive notification messages associated with an icon in the taskbar status area.
    uId As Long    ' Application-defined identifier of the taskbar icon.
    uFlags As Long ' Array of flags that indicate which of the other members contain valid data.
    ucallbackMessage As Long ' Application-defined message identifier. The system uses this identifier for notification messages that it sends to the window identified in hWnd. These notifications are sent when a mouse event occurs in the bounding rectangle of the icon.
    hIcon As Long  ' Handle to the icon to add, modify, or delete.
    szTip As String * 64 ' Tooltip text to display for the icon.
End Type
 
Private Const NIM_ADD = &H0     ' Adds an icon to the status area.
Private Const NIM_MODIFY = &H1  ' Modifies an icon in the status area.
Private Const NIM_DELETE = &H2  ' Deletes an icon from the status area.
 
' uFlags (the member in the NOTIFYICONDATA Type),
' can be a combination of the following:
Private Const NIF_MESSAGE = &H1 ' The uCallbackMessage member is valid.
Private Const NIF_ICON = &H2    ' The hIcon member is valid.
Private Const NIF_TIP = &H4     ' The szTip member is valid.
 
Public Enum WINMSG
    WM_LBUTTONDOWN = &H201& ' Left mouse button down
    WM_LBUTTONUP = &H202&
    WM_LBUTTONDBLCLK = &H203&
    
    WM_RBUTTONDOWN = &H204&
    WM_RBUTTONUP = &H205& ' Right mouse button up.
    WM_RBUTTONDBLCLK = &H206&
    
    WM_MBUTTONDOWN = &H207&
    WM_MBUTTONUP = &H208&
    WM_MBUTTONDBLCLK = &H209&
    
    WM_COMMAND = &H111&
    WM_SHOWWINDOW = &H18&
End Enum
      
Private Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean
 
'============= Window Constants and Declarations ================================
Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" ( _
     ByVal hWnd As Long, _
     ByVal wMsg As Long, _
     ByVal wParam As Long, _
     ByVal lParam As Long) As Long
 
Private Declare Function SendDlgItemMessage Lib "user32.dll" Alias "SendDlgItemMessageA" ( _
     ByVal hDlg As Long, _
     ByVal nIDDlgItem As Long, _
     ByVal wMsg As Long, _
     ByVal wParam As Long, _
     ByVal lParam As Long) As Long
 
'============= Public notification events ========================================
Public Event Notify(wParam As Long, lParam As Long)
 
'============= Private data members ==============================================
Private m_MenuControl As Long
Private m_Menu As clsMenu
'Private m_MenuItemsCount As Long
 
Private m_DisplayIcon As IPictureDisp
Private m_DisplayText As String
Private m_IconVisible As Boolean
 
Private m_NotifyControlID As Long
Private m_NotifyData As NOTIFYICONDATA
0
Comanche
13.05.2011, 00:53
Was ist das - 'DoCommand MIE_OPEN' ?
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
13.05.2011, 00:58  [ТС]
Просто функция с параметром, обрабатывает определенную комманду (в данном случае делает Me.Show() .
0
Comanche
13.05.2011, 13:08
А если пошаманить:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub ucTrayIcon_Notify(wParam As Long, lParam As Long)
  Select Case (wParam)
  '...........
  '...........
  Case WM_LBUTTONDBLCLK:
    DoEvents
    DoCommand MIE_OPEN
    ' из следующих четырёх вызовов надо опытным путём оставить 1-2:
    SetForegroundWindow Form1.hWnd
    BringWindowToTop Form1.hWnd
    SetActiveWindow Form1.hWnd
    PutFocus Form1.Hwnd
  End Select
End Sub
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
13.05.2011, 14:36  [ТС]
Ни одна из этих функуий результата не дала, кроме того PutFocus я не нашел.
Пытался в Form_Activate поместить код
Me.ZOrder 1
Me.SetFocus
тоже без результатно.

Еще одно наблюдение:
Если я нахожусь в другой апликации и моя форма не видна (минимизированна или скрыта другими окнами), то иконка не улавливает двойного нажатия.
Если я делаю одно нажатие на иконку (фокус переходит с другого окна на Taskbar), то двойное нажатие происходит и форма открывается, но без фокуса.
Если я делаю дополнительное нажатие но не на форму а на иконку, то форма активизируется, как будто я нажал на саму форму (это и логично, так как сообщения передаются в форму).
0
Comanche
13.05.2011, 15:06
У тебя явно какая-то лажа с размещением (и управлением) иконки в трее. Предлагаю скачать откуда-нибудь заведомо рабочий вариант (хоть в виде класса, хоть в виде CTL/OCX) и поиграться с ним. Если твоя проблема исчезнет - то уже будет проще искать причину. Рабочих вариантов в Сети море - ищи на VBNET.RU, vbAccelerator.Com, Mentalis.org, etc.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.05.2011, 15:06
Помогаю со студенческими работами здесь

Affiliate tracking cookie (Tracking cookie)
Здравствуйте! Всё началось с того, что я заметил несанкционированный выход из своей почты. Решил зайти - неверный пароль. Пароль я...

Обьясните пожалуйста как работает селектор .main-menu > li:hover .sub-menu
<!DOCTYPE html> <html lang="ru"> <head> <meta charset="utf-8"> <title>Отображаем подменю при...

Компонент menu и menu.section вывести картинку
Здравствуйте, просмотрел все различные тему, перепробовал все приведенные коды, но картинку так и не удалось вывести Структура...

Message Tracking
Если я только запустила на сервере message tracking , и только создала MTSTORE. То получается, отслеживаться будут письмо только с этого...

Скроллинг с помощью клавиатуры
Это часть кода рабочей программы. не могу понять почему не работает VK_HOME и VK_END. Почему-то при нажатие на CTRL окно автоматически...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru