Avatar billede ultik Nybegynder
11. november 2001 - 16:26 Der er 5 kommentarer og
1 løsning

Callback fra tray og hotkey?

Hej

Jeg skal bruge en funktion til at handle et callback fra et trayicon, og et RegisterHotKey kald. Mit program gør følgende, først tilføjer det sig i trayen, og registrerer en hotkey. Når så der sker noget, altså en event på trayikonet, eller et tryk på hotkey\'en, skal jeg jo handle eventen, men jeg har intet vindue i mit program.... hvordan klarer jeg dette? det er en MFC app, med MFC Appwizard, hvor jeg har fjernet dialogen, og alt min kode er indtil videre i appclassen\'s InitInstance funktion. Så er meningen at exit kode skal komme i den her funktion til at handle de events, men hvordan laver jeg den, når jeg ikke har noget vindue?

Min kode :

BOOL COpenerApp::InitInstance()
{   
    NOTIFYICONDATA nid;
    nid.cbSize = sizeof(NOTIFYICONDATA);
    nid.hIcon = LoadIcon(IDR_MAINFRAME);
    // her er problemet, hvad skal jeg give den et handle på?
        // nid.hWnd =
    strcpy(nid.szTip, \"test ting\");
        // når jeg finder ud af hvordan jeg registrer
        // beskederne, skal der selvfølgelig tilføjes
        // NIF_MESSAGE hertil....
    nid.uFlags = NIF_ICON|NIF_TIP;

    Shell_NotifyIcon(NIM_ADD, &nid);
        // den skal blive kørende...
    return TRUE;
}

når jeg for lavet den funktion der skal handle beskederne, tilføjer jeg så en RegisterHotKey, og en WM_HOTKEY klausul i funktionen, men hvoooordan laver jeg en funktion så jeg kan bruge dens handle ? skal jeg lave en slags callback klasse?

det er lidt dårligt formuleret, men jeg håber i forstår mig og kan hjælpe...

Med venlig hilsen og på forhånd tak
Ulrik Jensen
ulrik@qcom.dk
Avatar billede jpk Nybegynder
11. november 2001 - 18:40 #1
Du er inde på noget af det rigtige, du skal bruge en callback funktion.
Tjek SystemTrayDemo\'en på www.codeguru.com, den indeholder en wrapper-class til at håndtere al den nødvendige funktionalitet, endda animering af tray-ikonet!
Avatar billede ultik Nybegynder
11. november 2001 - 18:54 #2
jeg kan sagtens animere ikonet hvis det var nødvendigt, men det er mere hvordan jeg får den til at tage en funktion som argument ( eller fpr et handle til funktionen )... kigger lige på linket
Avatar billede ultik Nybegynder
11. november 2001 - 19:04 #3
hmm, jeg kan ikke bruge alt det der til noget desværre, alle eksemplerne på codeguru benytter sig af en dialogbox, og jeg har ingen vinduer i mit projekt, ellers kunne jeg godt bare sende beskeden til det vindues messageloop, men jeg vil lave en funktion, der bliver kørt når der kommer en besked fra tray\'en. Altså skal jeg sætte et handle til denne funktion når i min NOTIFYICONDATA ikke? hvordan gør jeg det? er det nødvendigt at konstruere et vindue, og så bruge dets messageloop til det?
Avatar billede jpk Nybegynder
11. november 2001 - 19:11 #4
Nemlig, så vidt jeg husker er det også den fremgangsmåde der bliver brugt i føromtalte eksempel! (Det kan selvfølgelig være jeg ta\'r fejl, men jeg mener han bruger et \'usynligt\' vindue)
Avatar billede ultik Nybegynder
11. november 2001 - 19:16 #5
jeg kunne ikke ifnde noget eksempel der hed præcis SystemTRayDemo men der var en 4-5 artikler, de brugte så vidt jeg kunne se allesammen vinduer........
Avatar billede ultik Nybegynder
11. november 2001 - 21:23 #6
har fundet ud af det, jeg gør det at jeg laver en klasse der nedarver fra public CFrameWnd, og så overloader jeg dens WindowProc, der kan jeg så fange WM_HOTKEY, og (WM_USER+2) (som er den jeg har sat til at blive sendt fra tray-ikonet)

koden ser således ud :

class CMyWnd: public CFrameWnd
{
public:
    CMyWnd();
    LRESULT WindowProc(UINT m, WPARAM w, LPARAM l);
};

CMyWnd::CMyWnd()
{
    CFrameWnd::CFrameWnd();
}

CMyWnd *frm;
NOTIFYICONDATA nid;

BOOL COpenerApp::InitInstance()
{
    frm = new CMyWnd();

    frm->Create(NULL, \"Test\", NULL,CRect(0,0,200,200),NULL,NULL,NULL);

    m_pMainWnd = frm;

    frm->ShowWindow(0);

    nid.cbSize = sizeof(NOTIFYICONDATA);
    nid.hIcon = LoadIcon(IDR_MAINFRAME);
    nid.hWnd = frm->m_hWnd;
    nid.uCallbackMessage = WM_USER+2;
    nid.uID = 1024;
    strcpy(nid.szTip, \"test ting\");
    nid.uFlags = NIF_ICON|NIF_TIP|NIF_MESSAGE;

    Shell_NotifyIcon(NIM_ADD, &nid);

    RegisterHotKey(frm->m_hWnd,1025,MOD_CONTROL|MOD_SHIFT,VkKeyScan(\'o\'));

    return TRUE;
}

LRESULT CMyWnd::WindowProc(UINT m, WPARAM w, LPARAM l)
{
    if (m == nid.uCallbackMessage)
    {
        if (l == WM_LBUTTONDOWN);
            // her kører jeg noget kode
        if (l == WM_RBUTTONUP)
        {
            Shell_NotifyIcon(NIM_DELETE, &nid);
            PostQuitMessage(0);
        }
        return FALSE;
    }

    if (m == WM_HOTKEY)
    {
        if (w == 1025)
        {
// her er der blevet trykket CTRL+SHIFT+O
        }
    }

    return TRUE;
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester