Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++, WinAPI: SetTimer ei toimi

Aloittelija3 [14.10.2006 18:19:55]

#

#include <windows.h>
#include <fstream>

HWND hwnd;

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument, int roskaa)

{
    SetTimer(hwnd, 1337, 50, (TIMERPROC) NULL);
    MSG messages;

    while (GetMessage (&messages, NULL, 0, 0))
    {

        TranslateMessage(&messages);

        DispatchMessage(&messages);
    }

    return messages.wParam;
}


LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
           case WM_TIMER:
                {
                MessageBox(hwnd, "Ajastin toimii", "jee", MB_OK);
                break;
                }
        default:
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}

Mikä tossa on vikana? Kääntäjä ei valita mitään, eikä ees anna varotuksia mutta ikinä ei päästä WM_TIMER kohtaan.

EDIT: toi ei myöskään toimi jos laittaa: SetTimer(null, .. .. ..)

Metabolix [14.10.2006 19:02:26]

#

Laita nyt edes NULL hwnd:n arvoksi. Nythän siinä voi olla vaikka mitä sotkua. Jos se ei auta, pitää varmaankin luoda ikkuna.

Aloittelija3 [14.10.2006 19:14:32]

#

Höh, ei se toiminu. Kai se ikkuna sitten pitää luoda, kiitos kuitenki.

Metabolix [14.10.2006 19:17:20]

#

Jaa, olit näköjään NULLia kokeillutkin, enpä huomannut lukea niin tarkasti.

Tarkistapa, palauttaako tuo funktio jotakin muuta kuin nollan eli onnnistuuko luonti ollenkaan.

if (!SetTimer(0, 0, aika, 0)) {
    // Virhe
}

Virheen voi tulostaa MSDN:n esimerkin mukaan.

Ja WndProcin käyttö vaatii ikkunaluokkaa, jolle on asetettu se WndProc. Eihän tuossa ohjelma voi mistään tietää, että viestit pitäisi lähettää edelleen juuri tuolle WndProc-funktiolle. Suosittelen siis TimerProcin käyttöä.

Aloittelija3 [14.10.2006 19:47:14]

#

Ehm.. :S en oikein osannu käyttää tota linkin neuvoa

koo [15.10.2006 21:11:33]

#

Tuossa koodissahan ei rekisteröidä window-luokkaa ollenkaan eikä ikkunaa luoda. Miten tuo ajastinviesti silloin voisi edes ohjautua tuolle window-proseduurille?

Jos tuon haluaa toimivan ilman ikkunoita, pitää tehdä jotenkin tähän malliin:

#include <windows.h>

int WINAPI WinMain(HINSTANCE, HINSTANCE, char *, int)
{
        SetTimer(0, 1337, 5000, 0);
        MSG msg;

        while (GetMessage(&msg, 0, 0, 0))
        {
                TranslateMessage(&msg);
                if (msg.message == WM_TIMER)
                        MessageBox(0, "Toimii!", "Ajastin", MB_OK);
                DispatchMessage(&msg);
        }

        return msg.wParam;
}

(Tuo on C++:aa; merkistö on multi-byte, ei wide; GetMessage:n paluuarvo pitäisi tarkastaa kunnolla, se kun voi olla nolla, ei-nolla tai -1; funktiokutsujen paluuarvot pitäisi muutoinkin tarkastaa; eikä ohjelma lopeta vapaaehtoisesti.)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta