Toon posts:

[C++] Icon Tray Menu

Pagina: 1
Acties:
  • 162 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik ben al dagen bezig met het uitzoeken hoe ik een tray menu kan toevoegen aan mijn systray Icon. Ik krijg met geen mogelijkheid messages van het icon opgevangen in m'n WndProc.

Example
Afbeeldingslocatie: http://www.synaptex.biz/locen/smallwidgets/4S_Lock/v1_06/HTML_Help/Menu_Secured_Mode_XP.png

Ik heb `MYMSG_NOTIFYICON` meegegeven aan de uCallbackMessage van de NOTIFYICONDATA structure. En die probeer ik op te vangen in WndProc maar ik krijg niets binnen.

C++: main.cpp
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
// Headers
#include "main.h"
#include <windows.h>

// Globals
NOTIFYICONDATA NotifyIconData;

// Event Message Handler Prototype
LRESULT CALLBACK WndProc(HWND hWindow, UINT msg, WPARAM wParam, LPARAM lParam);

// Main Entry Point
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int nCmdShow)
{
    MSG             msg;
    HWND            hWindow;
    WNDCLASSEX      wndclass;

    // Window Properties
    wndclass.cbSize          = sizeof(wndclass);
    wndclass.style           = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc     = WndProc;
    wndclass.cbClsExtra      = NULL;
    wndclass.cbWndExtra      = NULL;
    wndclass.hInstance       = hInstance;
    wndclass.hIcon           = LoadIcon(hInstance, MAKEINTRESOURCE(ID_ICON1));
    wndclass.hIconSm         = LoadIcon(hInstance, MAKEINTRESOURCE(ID_ICON1));
    wndclass.hCursor         = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground   = CreateSolidBrush(RGB(235,233,238));
    wndclass.lpszMenuName    = TEXT("ID_MENU");
    wndclass.lpszClassName   = APP_NAME;

    // Register Window Class
    if(!RegisterClassEx(&wndclass))
    {
        return 0;
    }
        
    // Create Main Window
    hWindow = CreateWindow(APP_NAME, APP_NAME, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, 320, 240, NULL, NULL, hInstance, NULL);

    // Show & Update Window
    ShowWindow(hWindow, nCmdShow);
    UpdateWindow(hWindow);

    // Tray Icon
    NotifyIconData.cbSize = sizeof(NotifyIconData);
    NotifyIconData.hWnd = hWindow;
    NotifyIconData.uID = 1;
    NotifyIconData.uFlags = NIF_ICON | NIF_TIP | NIF_INFO;
    NotifyIconData.uCallbackMessage = MYMSG_NOTIFYICON;
    NotifyIconData.hIcon = wndclass.hIcon;
    lstrcpy(NotifyIconData.szTip, APP_NAME);
    NotifyIconData.uTimeout = 10000;
    lstrcpy(NotifyIconData.szInfo, TEXT("Ik ben een gemene bug ;)"));
    lstrcpy(NotifyIconData.szInfoTitle, TEXT("Hallo!"));
    NotifyIconData.dwInfoFlags = NIIF_NONE;

    Shell_NotifyIcon(NIM_ADD, &NotifyIconData);

    // Process Messages
    while(GetMessage(&msg, NULL, 0, 0))
    {
       TranslateMessage(&msg);
       DispatchMessage(&msg);
    }

    UnregisterClass(APP_NAME, wndclass.hInstance);

    return 0;
}

// Event Message Handler
LRESULT CALLBACK WndProc(HWND hWindow, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_COMMAND:
            if(HIWORD(wParam) == BN_CLICKED)
            {
                if(LOWORD(wParam) == ID_FILE_NEW)
                {
                    MessageBox(NULL, TEXT("New File!"), APP_NAME, MB_ICONQUESTION | MB_OK);
                }
                if(LOWORD(wParam) == ID_FILE_OPEN)
                {
                    MessageBox(NULL, TEXT("Open File!"), APP_NAME, MB_ICONQUESTION | MB_OK);
                }
                if(LOWORD(wParam) == ID_FILE_EXIT)
                {
                    Shell_NotifyIcon(NIM_DELETE, &NotifyIconData);
                    PostQuitMessage(0);
                }
            }
        break;

        case MYMSG_NOTIFYICON:
            MessageBox(NULL, TEXT("Icon Message"), APP_NAME, MB_ICONQUESTION | MB_OK);
        break;

        case WM_DESTROY:
            Shell_NotifyIcon(NIM_DELETE, &NotifyIconData);
            PostQuitMessage(0);
        break;

        default:
            return DefWindowProc(hWindow, msg, wParam, lParam);
        break;
    }

    return 0;
}


C++: main.h
1
2
3
4
5
6
7
8
9
10
11
#define _WIN32_IE 0x0501

#define APP_NAME            TEXT("Simple Window Example")

#define ID_ICON1            100

#define ID_FILE_NEW      101
#define ID_FILE_OPEN        102
#define ID_FILE_EXIT        103

#define MYMSG_NOTIFYICON    (WM_APP + 104)


C++: main.rc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "main.h"

ID_ICON1 ICON bug.ico

ID_MENU MENU DISCARDABLE
BEGIN
       POPUP "&File"
       BEGIN
               MENUITEM "&New",         ID_FILE_NEW
               MENUITEM "&Open",        ID_FILE_OPEN
               MENUITEM SEPARATOR
               MENUITEM "E&xit",        ID_FILE_EXIT
       END
END


Ik hoop dat iemand mij kan helpen. Ik werk op Microsoft Visual C++ 2005 Express edition.

Take care,
Pherion

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik wil je nogmaals wijzen op RobIII in "\[C++] Icon Tray Menu" maar dan moet je even de klemtoon leggen op "relevante", "quickstart" en eigenlijk zo'n beetje de complete laatste alinea. Ik mis o.a. hoe/wat je gedebugged hebt. Je dumpt hier een dikke 100 regels code en verwacht dat wij het gaan uitzoeken voor je.

Overigens, wat ik zo 1 2 3 zie is dat je MYMSG_NOTIFYICON (WM_APP + 104) gebruikt. Klopt dat wel? (Zo op het eerste gezicht hoor...)
Heb je al geprobeerd gewoon het msg number af te drukken / msgbox-en? Ik neem aan dat de andere WM_ messages wel "doorkomen"?

Bij nader inzien kan deze w.m.b. open blijven, maar dan wil ik wel dat je constructief meewerkt ;)
offtopic:
En kun je please stoppen met dat groeten? Dat is @GoT helemaal niet nodig.

[ Voor 23% gewijzigd door RobIII op 31-08-2006 02:24 ]

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


Verwijderd

Topicstarter
RobIII schreef op donderdag 31 augustus 2006 @ 02:01:
Ik wil je nogmaals wijzen op RobIII in "\[C++] Icon Tray Menu" maar dan moet je even de klemtoon leggen op "relevante", "quickstart" en eigenlijk zo'n beetje de complete laatste alinea. Ik mis o.a. hoe/wat je gedebugged hebt. Je dumpt hier een dikke 100 regels code en verwacht dat wij het gaan uitzoeken voor je.

Overigens, wat ik zo 1 2 3 zie is dat je MYMSG_NOTIFYICON (WM_APP + 104) gebruikt. Klopt dat wel? (Zo op het eerste gezicht hoor...)
Heb je al geprobeerd gewoon het msg number af te drukken / msgbox-en? Ik neem aan dat de andere WM_ messages wel "doorkomen"?

Bij nader inzien kan deze w.m.b. open blijven, maar dan wil ik wel dat je constructief meewerkt ;)
offtopic:
En kun je please stoppen met dat groeten? Dat is @GoT helemaal niet nodig.
Ik heb echt geen idee of `MYMSG_NOTIFYICON (WM_APP + 104)` klopt (ik weet namelijk niet wat ik hier moet invullen). Ik heb het overgenomen van een ander script met een tray menu (heb verder wel alles zelf geschreven). Ik heb inderdaad geprobeerd de berichten op te vangen maar er komt niets door, de andere berichten wel inderdaad :).

Ik plaatste de hele code zodat je kan zien wat ik wel en niet gedaan had. Ik wil dit topic niet gebruiken om mijn code te laten debuggen, sorry als het zo leek. Mijn code compiled gewoon zonder error's. Ik zou alleen graag een duwtje in de goede richting willen hoe ik dat tray menu aan de gang kan krijgen.

Dit keer groet ik niet :*)

  • MisterData
  • Registratie: September 2001
  • Laatst online: 11-02 08:33
Start Spy++ anders eens en kijk of je window iets van messages binnenkrijgt die ermee te maken hebben? :)

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Als de andere messages gevangen worden, dan zou je in je default case van je switch eens een breakpoint kunnen zetten om te kijken welke message je dan wel krijgt (als je al iets krijgt) bij het kliken op het trayicon.

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


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13-02 18:54

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op donderdag 31 augustus 2006 @ 03:43:
[...]


Ik heb echt geen idee of `MYMSG_NOTIFYICON (WM_APP + 104)` klopt
Dan zoek je de definitie van WM_APP toch op?
The WM_APP constant is used to distinguish between message values that are reserved for use by the system and values that can be used by an application to send messages within a private window class. The following are the ranges of message numbers available.
0 through WM_USER–1 - Messages reserved for use by the system.
WM_USER through 0x7FFF - Integer messages for use by private window classes.
WM_APP through 0xBFFF - Messages available for use by applications.
0xC000 through 0xFFFF - String messages for use by applications.
Greater than 0xFFFF - Reserved by the system.
Dus WM_APP t/m WM_APP+0x3fff zijn vrij te gebruiken
RobIII schreef op donderdag 31 augustus 2006 @ 10:23:
Als de andere messages gevangen worden, dan zou je in je default case van je switch eens een breakpoint kunnen zetten om te kijken welke message je dan wel krijgt (als je al iets krijgt) bij het kliken op het trayicon.
Je zou al messages moeten krijgen zodra je over je icon heen moved met de muis.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
.oisyn schreef op donderdag 31 augustus 2006 @ 11:05:
[...]

Dan zoek je de definitie van WM_APP toch op?

[...]

Dus WM_APP t/m WM_APP+0x3fff zijn vrij te gebruiken


[...]

Je zou al messages moeten krijgen zodra je over je icon heen moved met de muis.
Het werkt nu wel, ik had de `NIF_MESSAGE` bij uFlag moeten zetten. Nu het traymenu maken.

Edit Gelukt! Bedankt voor julle hulp!

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        case MYMSG_NOTIFYICON:
            switch (lParam)
            {
                case WM_LBUTTONUP:
                    MessageBox(NULL, TEXT("Linker muisknop!"), APP_NAME, MB_ICONQUESTION | MB_OK);
                break;

                case WM_RBUTTONUP:
                    POINT pt;
                    HMENU hMenu = CreatePopupMenu();
                    AppendMenu(hMenu, MF_STRING, ID_FILE_EXIT, TEXT("Exit"));
                    GetCursorPos(&pt);

                    SetForegroundWindow(hWindow);
                    TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_TOPALIGN, pt.x, pt.y, NULL, hWindow, NULL);
                    SetForegroundWindow(hWindow);

                    DestroyMenu(hMenu);
                    return false;

                break;
            }
        break;

[ Voor 51% gewijzigd door Verwijderd op 31-08-2006 16:04 ]

Pagina: 1