[vb6] Access TrayIcon PopupMenu with keyboard

Pagina: 1
Acties:

  • DPLuS
  • Registratie: April 2000
  • Niet online
Als je alles minimaliseert (Windows toets + M) en daarna doorTABt totdat je je focus krijgt in je systray (bijvoorbeeld volumeregeling-icoontje), kun je via SHIFT+F10 toegang krijgen tot het Popupmenu van de desbetreffende applicatie.
Je kunt dan met de pijltjestoetsen navigeren door het menu.

Dat lukt bij mijn applicatie dus niet.
Ik kan alleen via de rechtermuistoets toegang krijgen tot mijn Popupmenu.
Ik wil dus ook met toetsen door het menu kunnen navigeren, alleen heb ik geen idee hoe ik dat erin moet programmeren.
Iemand een idee?

Dit is de code die ik tot nu toe heb:

Visual Basic 6:
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
'---------------------------------------------------
' FORM1
'---------------------------------------------------

Option Explicit

Private Sub Command1_Click()
' onnodige code verwijderd...
End Sub

Private Sub Command2_Click()
' onnodige code verwijderd...
End Sub

Private Sub Form_Load()

' IconData.hwnd mag ook handle van ander form zijn (bijv. speciaal icon-form)
With IconData
    .cbSize = Len(IconData) ' The length of the NOTIFYICONDATA type
    .hIcon = Me.Icon ' A reference to the form's icon
    .hwnd = Me.hwnd ' hWnd of the form
    .szTip = "Mijn Tool" & Chr(0) 
    .uCallbackMessage = WM_MOUSEMOVE 
    .uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE ' 
    .uID = vbNull 
End With

End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

Dim Msg As Long

Msg = X 
' Form ScaleMode property = 3 - pixels in order to get the correct message

If Msg = WM_LBUTTONDBLCLK Then ' The user has double-clicked your icon
    Call mnuShow_Click ' Show the window
ElseIf Msg = WM_RBUTTONDOWN Then ' Right-click
    PopupMenu mnuPopup, , , , mnuShow ' Popup the menu
End If

End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

If UnloadMode = vbFormControlMenu Then ' Via ALT+F4 en kruisje controlbox
    Cancel = 1
    Me.WindowState = vbMinimized
    Call Shell_NotifyIcon(NIM_ADD, IconData)
    Me.Hide
End If

End Sub

Private Sub Form_Resize()

If Me.WindowState = 1 Then ' minimized
    Call Shell_NotifyIcon(NIM_ADD, IconData)
    Me.Hide
End If

End Sub

Private Sub Form_Unload(Cancel As Integer)

Shell_NotifyIcon NIM_DELETE, IconData

End Sub

Private Sub mnuExit_Click() ' mnuPopup -> mnuExit

Unload Me
' End ' Just to be sure the program has ended

End Sub

Private Sub mnuShow_Click() ' mnuPopup -> mnuShow

Me.WindowState = vbNormal
Shell_NotifyIcon NIM_DELETE, IconData
Me.Show

End Sub



'---------------------------------------------------
'Module1.bas
'---------------------------------------------------

Option Explicit

Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" ( _
    ByVal dwMessage As Long, _
    lpData As NOTIFYICONDATA _
) As Long

Public Const NIM_ADD = &H0
Public Const NIM_DELETE = &H2
Public Const NIM_MODIFY = &H1

Public Const NIF_ICON = &H2
Public Const NIF_MESSAGE = &H1
Public Const NIF_TIP = &H4

Public Const WM_LBUTTONDBLCLK = &H203
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const WM_MOUSEMOVE = &H200
Public Const WM_RBUTTONDBLCLK = &H206
Public Const WM_RBUTTONDOWN = &H204
Public Const WM_RBUTTONUP = &H205

Type NOTIFYICONDATA
        cbSize As Long
        hwnd As Long
        uID As Long
        uFlags As Long
        uCallbackMessage As Long
        hIcon As Long
        szTip As String * 64
End Type

Public IconData As NOTIFYICONDATA

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

In je applicatie (of je systray icon) een snelkoppeling implementeren waardoor met Shift + F10 het popup menu verschijnt? Lijkt me een logiche stap en ook implementeerbaar.

Wat betreft je systray icon, waarom gebruik je daarvoor niet een van de ik-weet-niet-hoeveel componentjes die voorhanden zijn...? Lijkt me dat dat wellicht een makkelijker manier van implementeren is, waardoor ook je shortcut makkelijk toe te wijzen is?

My personal website


  • DPLuS
  • Registratie: April 2000
  • Niet online
OZ-Gump schreef op 09 januari 2004 @ 13:22:
In je applicatie (of je systray icon) een snelkoppeling implementeren waardoor met Shift + F10 het popup menu verschijnt? Lijkt me een logiche stap en ook implementeerbaar.
Dit is het probleem ook niet, SHIFT+F10 werkt gewoon, maar ik kan daarna niet met de pijltjestoetsen navigeren door het submenu.
De focus blijft namelijk gewoon in de systray en niet in het menu.
Wat betreft je systray icon, waarom gebruik je daarvoor niet een van de ik-weet-niet-hoeveel componentjes die voorhanden zijn...? Lijkt me dat dat wellicht een makkelijker manier van implementeren is, waardoor ook je shortcut makkelijk toe te wijzen is?
Daar is het nu te laat voor, het werkt nu naar alle tevredenheid, behalve dat verhaal met de pijltjestoetsen...

  • GigaDave56
  • Registratie: Juni 2001
  • Laatst online: 14-12-2025
DPLuS schreef op 09 januari 2004 @ 12:11:

Visual Basic:
1
2
3
4
5
If Msg = WM_LBUTTONDBLCLK Then ' The user has double-clicked your icon
    Call mnuShow_Click ' Show the window
ElseIf Msg = WM_RBUTTONDOWN Then ' Right-click
    PopupMenu mnuPopup, , , , mnuShow ' Popup the menu
End If
[Wild Guess Mode :X ]

Mijn systray / popupmenu koppeling is anders, menubalk gekoppeld aan mouseclick,
maar misschien ook het menu showen als Msg = WM_LBUTTONDOWN?

[/Wild Guess Mode]

[ Voor 12% gewijzigd door GigaDave56 op 09-01-2004 13:55 . Reden: [code tags] ]

Not so Giga One
> I'd sell my soul for you, babe
> For money to burn, for you
> I'd give you all and have none, babe
> Just to, just to, to have you here by me... [Scooter - Rebel yell]


  • DPLuS
  • Registratie: April 2000
  • Niet online
Ik heb weer het e.e.a. uitgeplozen:

Op het moment dat ik een Right-click event trigger op mijn tray-icon (hetzij via de rechtermuistoets, hetzij via SHIFT+F10, hetzij via dat rare Windows-key'tje naast de CTRL-toets op mijn keyboard), krijg ik dus mijn pop-up menu te zien.
Alleen krijgt dit menu GEEN FOCUS!
Want als ik dan de pijltjestoetsen gebruik (bijv. naar links of rechts) scrollt de "active-focus" cursor door de icons in mijn systray.

Dus ik moet op de een of andere manier zorgen dat form1 ook de focus krijgt, of in ieder geval mijn submenu.
Ik had al geprobeerd form1.setfocus te doen, maar dan krijg ik een foutmelding in mijn IDE...

Is er überhaupt iemand die dit werkend heeft???

Verwijderd

In bijv. een .bas file toevoegen
Visual Basic:
1
2
Public Declare Function SetForegroundWindow Lib "user32" _
   (ByVal hwnd As Long) As Long


In m'n code staat dan dit:
Visual Basic:
1
2
3
      Case WM_RBUTTONUP ' 517 display popup menu
         lResult = SetForegroundWindow(Me.hwnd)
         Me.PopupMenu Me.mPopupSys

  • DPLuS
  • Registratie: April 2000
  • Niet online
Verwijderd schreef op 09 januari 2004 @ 17:12:
In bijv. een .bas file toevoegen
Visual Basic:
1
2
Public Declare Function SetForegroundWindow Lib "user32" _
   (ByVal hwnd As Long) As Long


In m'n code staat dan dit:
Visual Basic:
1
2
3
      Case WM_RBUTTONUP ' 517 display popup menu
         lResult = SetForegroundWindow(Me.hwnd)
         Me.PopupMenu Me.mPopupSys
_/-\o_ HAIL TO THE KING, BABY! _/-\o_

Dit werkt perfect! :)

Maar wat ik me dan afvraag:
Waarom werkte Me.SetFocus dan niet?
Die doet toch hetzelfde als die API-call, of niet??
Pagina: 1