Verwenden von Timern

In diesem Thema wird gezeigt, wie Sie Timer erstellen und zerstören und wie Sie einen Timer verwenden, um Mauseingaben in bestimmten Intervallen zu fangen.

Dieses Thema enthält folgende Abschnitte:

Erstellen eines Timers

Im folgenden Beispiel wird die SetTimer-Funktion verwendet, um zwei Timer zu erstellen. Der erste Timer wird für alle 10 Sekunden, der zweite für alle fünf Minuten festgelegt.

// 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 

Um die von diesen Timern generierten WM_TIMER Nachrichten zu verarbeiten, fügen Sie der Fensterprozedur für den hwnd-Parameter eine WM_TIMER-Case-Anweisung hinzu.

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; 
    } 

Eine Anwendung kann auch einen Timer erstellen, dessen WM_TIMER Nachrichten nicht von der Standard Fensterprozedur, sondern von einer anwendungsdefinierten Rückruffunktion verarbeitet werden, wie im folgenden Codebeispiel, das einen Timer erstellt und die Rückruffunktion MyTimerProc verwendet, um die WM_TIMER Nachrichten des Timers zu verarbeiten.

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

Die Aufrufkonvention für MyTimerProc muss auf der TimerProc-Rückruffunktion basieren.

Wenn Ihre Anwendung einen Timer erstellt, ohne ein Fensterhandle anzugeben, muss Ihre Anwendung die Nachrichtenwarteschlange auf WM_TIMER Nachrichten überwachen und sie an das entsprechende Fenster senden.

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 
    } 

Zerstören eines Timers

Anwendungen sollten die KillTimer-Funktion verwenden, um timer zu zerstören, die nicht mehr erforderlich sind. Im folgenden Beispiel werden die Timer zerstört, die durch die Konstanten IDT_TIMER1, IDT_TIMER2 und IDT_TIMER3 identifiziert werden.

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

Verwenden von Timerfunktionen zum Abfangen von Mauseingaben

Manchmal ist es notwendig, mehr Eingaben zu verhindern, während Sie einen Mauszeiger auf dem Bildschirm haben. Eine Möglichkeit, dies zu erreichen, besteht darin, eine spezielle Routine zu erstellen, die Mauseingaben abfängt, bis ein bestimmtes Ereignis auftritt. Viele Entwickler bezeichnen diese Routine als "Erstellen einer Mausefalle".

Im folgenden Beispiel werden die Funktionen SetTimer und KillTimer verwendet, um Mauseingaben zu fangen. SetTimer erstellt einen Timer, der alle 10 Sekunden eine WM_TIMER Nachricht sendet. Jedes Mal, wenn die Anwendung eine WM_TIMER Nachricht empfängt, zeichnet sie den Mauszeigerstandort auf. Wenn der aktuelle Speicherort mit dem vorherigen Speicherort identisch ist und das Standard Fenster der Anwendung minimiert wird, bewegt die Anwendung den Mauszeiger auf das Symbol. Wenn die Anwendung geschlossen wird, beendet KillTimer den Timer.

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. 
        // 
 
} 

Im folgenden Beispiel wird zwar auch gezeigt, wie Mauseingaben erfasst werden, aber die WM_TIMER Nachricht wird über die anwendungsdefinierte Rückruffunktion MyTimerProc und nicht über die Nachrichtenwarteschlange der Anwendung verarbeitet.

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; 
        } 
    } 
} 

Informationen zu Timern