Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Este tópico mostra como criar e destruir temporizadores e como usar um temporizador para intercetar a entrada do mouse em intervalos especificados.
Este tópico contém as seguintes seções.
- Criando um temporizador
- Destruindo um temporizador
- Usando funções de temporizador para intercetar a entrada do mouse
- Tópicos relacionados
Criando um temporizador
O exemplo a seguir usa a função SetTimer para criar dois temporizadores. O primeiro temporizador é definido para cada 10 segundos, o segundo para cada cinco minutos.
// 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
Para processar as mensagens WM_TIMER geradas por esses temporizadores, adicione uma instrução de caso WM_TIMER ao procedimento de janela associado ao parâmetro 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;
}
Um aplicativo também pode criar um temporizador cujas mensagens de WM_TIMER são processadas não pelo procedimento da janela principal, mas por uma função de retorno de chamada definida pelo aplicativo, como no exemplo de código a seguir, que cria um temporizador e usa a função de retorno de chamada MyTimerProc para processar as mensagens de WM_TIMER do temporizador.
// Set the timer.
SetTimer(hwnd, // handle to main window
IDT_TIMER3, // timer identifier
5000, // 5-second interval
(TIMERPROC) MyTimerProc); // timer callback
A convenção de chamada para MyTimerProc deve ser baseada na função de retorno de chamada TimerProc.
Se seu aplicativo cria um temporizador sem especificar um identificador de janela, seu aplicativo deve monitorar a fila de mensagens para WM_TIMER mensagens e enviá-las para a janela apropriada.
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
}
Destruindo um temporizador
Os aplicativos devem usar a função KillTimer para destruir temporizadores que não são mais necessários. O exemplo a seguir destrói os temporizadores identificados pelas constantes IDT_TIMER1, IDT_TIMER2 e IDT_TIMER3.
// Destroy the timers.
KillTimer(hwnd, IDT_TIMER1);
KillTimer(hwnd, IDT_TIMER2);
KillTimer(hwnd, IDT_TIMER3);
Usando funções de temporizador para intercetar a entrada do mouse
Às vezes é necessário evitar mais entradas enquanto haja um ponteiro do rato na tela. Uma maneira de conseguir isso é criar uma rotina especial que interceta a entrada do mouse até que um evento específico ocorra. Muitos desenvolvedores se referem a essa rotina como "construir uma ratoeira".
O exemplo a seguir usa as funções SetTimer e KillTimer para intercetar a entrada do mouse. SetTimer cria um temporizador que envia uma mensagem WM_TIMER a cada 10 segundos. Cada vez que o aplicativo recebe uma mensagem WM_TIMER, ele registra a localização do ponteiro do mouse. Se o local atual for o mesmo que o local anterior e a janela principal do aplicativo for minimizada, o aplicativo moverá o ponteiro do mouse para o ícone. Quando a aplicação fecha, KillTimer pára o temporizador.
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.
//
}
Embora o exemplo a seguir também mostre como intercetar a entrada do mouse, ele processa a mensagem de WM_TIMER por meio da função de retorno de chamada definida pelo aplicativo MyTimerProc, em vez de através da fila de mensagens do aplicativo.
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;
}
}
}
Tópicos relacionados