Udostępnij za pośrednictwem


Korzystanie z czasomierzy

W tym temacie pokazano, jak tworzyć i niszczyć czasomierze oraz jak używać czasomierza do wychwytowania danych wejściowych myszy w określonych odstępach czasu.

Ten temat zawiera następujące sekcje.

Tworzenie czasomierza

W poniższym przykładzie użyto funkcji SetTimer do utworzenia dwóch czasomierzy. Pierwszy czasomierz jest ustawiany co 10 sekund, drugi co pięć minut.

// Set two timers. 
 
SetTimer(hwnd,             // handle to main window 
    IDT_TIMER1,            // timer identifier 
    10000,                 // 10-second interval 
    (TIMERPROC) NULL);     // no timer callback 
 
SetTimer(hwnd,             // handle to main window 
    IDT_TIMER2,            // timer identifier 
    300000,                // five-minute interval 
    (TIMERPROC) NULL);     // no timer callback 

Aby przetworzyć komunikaty WM_TIMER generowane przez te czasomierze, dodaj instrukcję WM_TIMER przypadku do procedury okna dla parametru hwnd.

case WM_TIMER: 
 
    switch (wParam) 
    { 
        case IDT_TIMER1: 
            // process the 10-second timer 
 
             return 0; 
 
        case IDT_TIMER2: 
            // process the five-minute timer 

            return 0; 
    } 

Aplikacja może również utworzyć czasomierz, którego komunikaty WM_TIMER nie są przetwarzane przez procedurę głównego okna, ale przez funkcję wywołania zwrotnego zdefiniowanego przez aplikację, jak w poniższym przykładzie kodu, który tworzy czasomierz i używa funkcji wywołania zwrotnego MyTimerProc do przetwarzania komunikatów WM_TIMER czasomierza.

// Set the timer. 
 
SetTimer(hwnd,                // handle to main window 
    IDT_TIMER3,               // timer identifier 
    5000,                     // 5-second interval 
    (TIMERPROC) MyTimerProc); // timer callback

Konwencja wywoływania dla MyTimerProc musi być oparta na funkcji TimerProc wywołania zwrotnego.

Jeśli aplikacja tworzy czasomierz bez określania uchwytu okna, musi monitorować kolejkę komunikatów dla komunikatów WM_TIMER i wysyłać je do odpowiedniego okna.

HWND hwndTimer;   // handle to window for timer messages 
MSG msg;          // message structure 
 
    while (GetMessage(&msg, // message structure 
            NULL,           // handle to window to receive the message 
               0,           // lowest message to examine 
               0))          // highest message to examine 
    { 
 
        // Post WM_TIMER messages to the hwndTimer procedure. 
 
        if (msg.message == WM_TIMER) 
        { 
            msg.hwnd = hwndTimer; 
        } 
 
        TranslateMessage(&msg); // translates virtual-key codes 
        DispatchMessage(&msg);  // dispatches message to window 
    } 

Niszczenie czasomierza

Aplikacje powinny używać funkcji KillTimer, aby zniszczyć czasomierze, które nie są już niezbędne. Poniższy przykład niszczy czasomierze identyfikowane przez stałe IDT_TIMER1, IDT_TIMER2 i IDT_TIMER3.

// Destroy the timers. 
 
KillTimer(hwnd, IDT_TIMER1); 
KillTimer(hwnd, IDT_TIMER2); 
KillTimer(hwnd, IDT_TIMER3); 

Używanie funkcji czasomierza do wychwytowania danych wejściowych myszy

Czasami należy zapobiec dalszemu wprowadzaniu danych, gdy na ekranie znajduje się wskaźnik myszy. Jednym ze sposobów osiągnięcia tego celu jest utworzenie specjalnej procedury, która wychwyci wprowadzanie myszy do momentu wystąpienia określonego zdarzenia. Wielu deweloperów nazywa tę procedurę "tworzeniem pułapki myszy".

W poniższym przykładzie użyto funkcji SetTimer i KillTimer w celu wychwycenia danych wejściowych myszy. SetTimer tworzy czasomierz, który wysyła komunikat WM_TIMER co 10 sekund. Za każdym razem, gdy aplikacja odbiera komunikat WM_TIMER, rejestruje lokalizację wskaźnika myszy. Jeśli bieżąca lokalizacja jest taka sama jak poprzednia lokalizacja, a główne okno aplikacji jest zminimalizowane, aplikacja przenosi wskaźnik myszy do ikony. Po zamknięciu aplikacji KillTimer zatrzymuje czasomierz.

HICON hIcon1;               // icon handle 
POINT ptOld;                // previous cursor location 
UINT uResult;               // SetTimer's return value 
HINSTANCE hinstance;        // handle to current instance 
 
//
// Perform application initialization here. 
//
 
wc.hIcon = LoadIcon(hinstance, MAKEINTRESOURCE(400)); 
wc.hCursor = LoadCursor(hinstance, MAKEINTRESOURCE(200)); 
 
// Record the initial cursor position. 
 
GetCursorPos(&ptOld); 
 
// Set the timer for the mousetrap. 
 
uResult = SetTimer(hwnd,             // handle to main window 
    IDT_MOUSETRAP,                   // timer identifier 
    10000,                           // 10-second interval 
    (TIMERPROC) NULL);               // no timer callback 
 
if (uResult == 0) 
{ 
    ErrorHandler("No timer is available."); 
} 
 
LONG APIENTRY MainWndProc( 
    HWND hwnd,          // handle to main window 
    UINT message,       // type of message 
    WPARAM  wParam,     // additional information 
    LPARAM  lParam)     // additional information 
{ 
 
    HDC hdc;        // handle to device context 
    POINT pt;       // current cursor location 
    RECT rc;        // location of minimized window 
 
    switch (message) 
    { 
        //
        // Process other messages. 
        // 
 
        case WM_TIMER: 
        // If the window is minimized, compare the current 
        // cursor position with the one from 10 seconds 
        // earlier. If the cursor position has not changed, 
        // move the cursor to the icon. 
 
            if (IsIconic(hwnd)) 
            { 
                GetCursorPos(&pt); 
 
                if ((pt.x == ptOld.x) && (pt.y == ptOld.y)) 
                { 
                    GetWindowRect(hwnd, &rc); 
                    SetCursorPos(rc.left, rc.top); 
                } 
                else 
                { 
                    ptOld.x = pt.x; 
                    ptOld.y = pt.y; 
                } 
            } 
 
            return 0; 
 
        case WM_DESTROY: 
 
        // Destroy the timer. 
 
            KillTimer(hwnd, IDT_MOUSETRAP); 
            PostQuitMessage(0); 
            break; 
 
        //
        // Process other messages. 
        // 
 
} 

Poniższy przykład pokazuje również, jak przechwytywać dane wejściowe myszy, ale przetwarza komunikat WM_TIMER za pośrednictwem zdefiniowanej przez aplikację funkcji wywołania zwrotnego MyTimerProc, a nie za pośrednictwem kolejki komunikatów aplikacji.

UINT uResult;               // SetTimer's return value 
HICON hIcon1;               // icon handle 
POINT ptOld;                // previous cursor location 
HINSTANCE hinstance;        // handle to current instance 
 
//
// Perform application initialization here. 
//
 
wc.hIcon = LoadIcon(hinstance, MAKEINTRESOURCE(400)); 
wc.hCursor = LoadCursor(hinstance, MAKEINTRESOURCE(200)); 
 
// Record the current cursor position. 
 
GetCursorPos(&ptOld); 
 
// Set the timer for the mousetrap. 
 
uResult = SetTimer(hwnd,      // handle to main window 
    IDT_MOUSETRAP,            // timer identifier 
    10000,                    // 10-second interval 
    (TIMERPROC) MyTimerProc); // timer callback 
 
if (uResult == 0) 
{ 
    ErrorHandler("No timer is available."); 
} 
 
LONG APIENTRY MainWndProc( 
    HWND hwnd,          // handle to main window 
    UINT message,       // type of message 
    WPARAM  wParam,     // additional information 
    LPARAM   lParam)    // additional information 
{ 
 
    HDC hdc;            // handle to device context 
 
    switch (message) 
    { 
    // 
    // Process other messages. 
    // 
 
        case WM_DESTROY: 
        // Destroy the timer. 
 
            KillTimer(hwnd, IDT_MOUSETRAP); 
            PostQuitMessage(0); 
            break; 
 
        //
        // Process other messages. 
        // 
 
} 
 
// MyTimerProc is an application-defined callback function that 
// processes WM_TIMER messages. 
 
VOID CALLBACK MyTimerProc( 
    HWND hwnd,        // handle to window for timer messages 
    UINT message,     // WM_TIMER message 
    UINT idTimer,     // timer identifier 
    DWORD dwTime)     // current system time 
{ 
 
    RECT rc; 
    POINT pt; 
 
    // If the window is minimized, compare the current 
    // cursor position with the one from 10 seconds earlier. 
    // If the cursor position has not changed, move the 
    // cursor to the icon. 
 
    if (IsIconic(hwnd)) 
    { 
        GetCursorPos(&pt); 
 
        if ((pt.x == ptOld.x) && (pt.y == ptOld.y)) 
        { 
            GetWindowRect(hwnd, &rc); 
            SetCursorPos(rc.left, rc.top); 
        } 
        else 
        { 
            ptOld.x = pt.x; 
            ptOld.y = pt.y; 
        } 
    } 
} 

O czasomierzach