[VB6] - Systray programma werkt niet

Pagina: 1
Acties:

  • MickMack
  • Registratie: December 2001
  • Laatst online: 21-08 14:53
Ongeveer een maand geleden heb ik een erg handig programma gedownload waarmee je je eigen programma kan verbergen in de systray. Het leuke van dit programma is dat je ook een popup menu krijgt wanneer je met rechter muisknop op het icoon klikt in de systray. Dit programma bestaat uit 1 form, een class en een module.

Alles werkt perfect, totdat ik het popup menutje wil gaan uitbreiden. Standaard bestond het popup menu uit 3 items. Ik heb 2 items toegevoeg wat het totaal op 5 brengt (echt waar). Het probleem is nu dat wanneer je de laatste (5de) optie van het popup menu aanklikt het, het script uitgevoerd wordt wat bij de eerste optie van het menu hoort. Optie 5 verschijnt dus wel in het menu, maar wanneer je er op klikt wordt het script van optie 1 uitgevoerd.

Met geen mogelijkheid krijg ik het programma goed werkend met 5 menu opties. Ik heb de schrijver van dit programma al gemaild en kreeg als antwoord dat ik iets moest veranderen in het commande "WM_Command". Ik heb alle waarden die samenhangen met die commando al gewijzigd maar niks helpt.

De menuitems staan gedefinieerd in het form zelf en ziet er ongeveer als volgt uit:
code:
1
2
3
4
5
6
  AppendMenu hPopup, MF_STRING, WM_MENUBASE, "&Show Form1"
  AppendMenu hPopup, MF_STRING, WM_MENUBASE + 1, "&Show Form2"
  AppendMenu hPopup, MF_STRING, WM_MENUBASE + 2, "&Show Form3"
  AppendMenu hPopup, MF_STRING, WM_MENUBASE + 3, "&About"
  AppendMenu hPopup, MF_SEPARATOR, WM_MENUBASE, ""
  AppendMenu hPopup, MF_STRING, WM_MENUBASE + 4, "&Exit"


verder staat er nog een stukje code wat iets met het commando WM_Command te maken heeft:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Public Function SubWndProc(ByVal hwnd As Long, ByVal MSG As Long, 
ByVal wParam As Long, ByVal lParam As Long) As Long
  On Error Resume Next
 
  Select Case MSG
    Case WM_COMMAND And HiWord(wParam) = 0   
    
      If (wParam And WM_MENUBASE) = WM_MENUBASE Then 
        RtlMoveMemory st, ObjPointer, 4
          st.Clicked (wParam And 3)            
        RtlMoveMemory st, 0&, 4
      End If
      
    Case TRAY_CALLBACK
        RtlMoveMemory st, ObjPointer, 4     
          st.SendEvent lParam, wParam   
        RtlMoveMemory st, 0&, 4                         
    End Select
   
       SubWndProc = CallWindowProc(PrevWndProc, hwnd, MSG, wParam, 
       lParam)
End Function



De code die wordt uitgevoerd als je een popup item klikt staat in cases. Als ik bijvoorbeeld op show form 2 zou kilkken dan voert deze case 1 uit omdat in de code regel +1 staat. Deze waarde +1 wordt doorgegeven aan de functie welke de cases bevat. Veel van de code komt van de VB 5 CD af. De maker van het prog zegt er dit over: "This is the VB5 Systray control ported to a Class Module". Veel source code staat dus gewoon op de VB 5 CD

De waarden 4 en 3 heb ik al geprobeerd te veranderen, maar dat werkt dus niet. Erger nog, daar raakt het hele menu van in de war. Er staat nog veel meer code in dat programma uiteraard, maar ik weet niet echt wat van belang is en alles posten dan zijn we ook 4 A4-tjes verder. De rest van de code is voornamelijk declaraties.

Ik heb al wel wat ervaring met VB, maar dit gaat net ff iets te ver. Zou iemand me hiermee kunnen helpen uitzoeken wara het probleem ligt? PLease :'(

[ Voor 52% gewijzigd door MickMack op 20-02-2003 21:13 . Reden: Oeps was spam ]

The JavaScript GoT Tracker


  • Hydrax
  • Registratie: December 2001
  • Laatst online: 17-07 16:31

Hydrax

*huh?*

Ehmm, ik wil eigenlijk wel helpen (ben eigenlijk ook zeer nieuwschierig naar dat systray proggie).
Maar waarom staat er spam ipv een link?
edit:
ohh ik zie dat het door een modje is ge-edit, ehmm waarom?

[ Voor 22% gewijzigd door Hydrax op 20-02-2003 20:45 ]

Every program has two purposes -- one for which it was written and another for which it wasn't. specs


  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

Ik begrijp hier tamelijk weinig van, VB is niet mijn taal ;)

Het enige wat mij wil opvallen is
code:
1
st.Clicked (wParam And 3)

Hier worden, dunkt mij, alle bits behalve de meest rechter twee weggemasked, en dan blijven dus de mogelijkheden < 4 over. Als je daar nou eens
code:
1
st.Clicked (wParam And 7)

van maakt? Is wel Q&D, maar dan weet je iig waar je het zou moeten zoeken. Als dat niet werkt, moet je wellicht ook nog even
code:
1
If (wParam And WM_MENUBASE) = WM_MENUBASE Then

veranderen in
code:
1
If ((wParam Or 7) And WM_MENUBASE) = WM_MENUBASE Then

want ik heb geen idee of de LSB van WM_MENUBASE != 0. HTH...
edit:
Als ik gelijk heb vind ik het eik wel hele slordige code!

[ Voor 12% gewijzigd door Rataplan op 21-02-2003 08:36 ]


Journalism is printing what someone else does not want printed; everything else is public relations.


  • MickMack
  • Registratie: December 2001
  • Laatst online: 21-08 14:53
Nou je eerste optie werkte al meteen _/-\o_. Wat stom zeg, ik heb het veranderd in 4,5 en 6, maar dat werkte niet. 7 doet het idd goed. Thanx!
Hier worden, dunkt mij, alle bits behalve de meest rechter twee weggemasked, en dan blijven dus de mogelijkheden < 4 over.
Hmm, zou je dat nog iets nader willen toelichten, want ik begrijp hem nog niet helemaal. Dan heb ik ook weer wat geleerd :)

The JavaScript GoT Tracker


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
MickMack schreef op 21 February 2003 @ 18:26:
Hmm, zou je dat nog iets nader willen toelichten, want ik begrijp hem nog niet helemaal. Dan heb ik ook weer wat geleerd :)
En DAT is er nou mis met de huidige generatie "programmeurs". Weten bij *GOD* niet wat Bits en Bytes zijn. Laat staan OR/AND/XOR etc.

Let op, wat waarheidstabellen:
Afbeeldingslocatie: http://www.theforumisdown.com/uploadfiles/0103/Waarheid2.gif

Een Byte bestaat uit 8 bits, 8 enen of nullen (Komt van "By Eight", dus Byte :P). Die tabellen lees je als volgt:

0 AND 0 = 0
0 AND 1 = 0
1 AND 0 = 0
1 AND 1 = 1

0 OR 0 = 0
0 OR 1 = 1
1 OR 0 = 1
1 OR 1 = 1

Voor de rest: zie de waarheidstabellen.

En dan nu masking:
code:
1
2
Byte A: 01011011 (willekeurige waarde)
Byte B: 00000011 (=3)

Als je A AND B doet, dan zie je dus dat je alleen de rechtse twee bits uit byte A "filtert".
Wil je de rechtse 4 bits, dan krijg je dus:
code:
1
2
Byte A: 01011011 (willekeurige waarde)
Byte B: 00001111 (=15)


Voor de duidelijkheid, je moet dus uit byte A bit X AND-en met byte B bit X...
Wat voorbeeldjes:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Byte A: 01011011 (willekeurige waarde)
Byte B: 00001111 (=15)
        ________
Result: 00001011 (=11)



Byte A: 01011011
Byte B: 00111111
        ________
Result: 00011011



Byte A: 01011011
Byte B: 00110000
        ________
Result: 00010000


Veel plezier ermee :)

Oh, enne NOFI!!!

[ Voor 15% gewijzigd door RobIII op 21-02-2003 18:42 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • MickMack
  • Registratie: December 2001
  • Laatst online: 21-08 14:53
Ahaa, nu begrijp ik het. Thnx. Natuurkunde is ook al zo lang geleden :)
Topicje closed dan maar.

The JavaScript GoT Tracker

Pagina: 1