Cette rubrique montre comment créer et détruire des minuteurs, et comment utiliser un minuteur pour intercepter l’entrée de la souris à des intervalles spécifiés.
L’exemple suivant utilise la fonction SetTimer pour créer deux minuteurs. Le premier minuteur est défini toutes les 10 secondes, le second toutes les cinq minutes.
// 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
Pour traiter les messages WM_TIMER générés par ces minuteurs, ajoutez une instruction case WM_TIMER à la procédure de fenêtre pour le paramètre 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;
}
Une application peut également créer un minuteur dont les messages WM_TIMER sont traités non pas par la procédure de fenêtre main, mais par une fonction de rappel définie par l’application, comme dans l’exemple de code suivant, qui crée un minuteur et utilise la fonction de rappel MyTimerProc pour traiter les messages WM_TIMER du minuteur.
// Set the timer.
SetTimer(hwnd, // handle to main window
IDT_TIMER3, // timer identifier
5000, // 5-second interval
(TIMERPROC) MyTimerProc); // timer callback
La convention d’appel pour MyTimerProc doit être basée sur la fonction de rappel TimerProc .
Si votre application crée un minuteur sans spécifier de handle de fenêtre, votre application doit surveiller la file d’attente des messages WM_TIMER et les distribuer à la fenêtre appropriée.
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
}
Destruction d’un minuteur
Les applications doivent utiliser la fonction KillTimer pour détruire les minuteurs qui ne sont plus nécessaires. L’exemple suivant détruit les minuteurs identifiés par les constantes IDT_TIMER1, IDT_TIMER2 et IDT_TIMER3.
// Destroy the timers.
KillTimer(hwnd, IDT_TIMER1);
KillTimer(hwnd, IDT_TIMER2);
KillTimer(hwnd, IDT_TIMER3);
Utilisation des fonctions du minuteur pour intercepter l’entrée de la souris
Parfois, il est nécessaire d’empêcher davantage d’entrées lorsque vous avez un pointeur de souris à l’écran. Une façon d’y parvenir consiste à créer une routine spéciale qui intercepte l’entrée de la souris jusqu’à ce qu’un événement spécifique se produise. De nombreux développeurs appellent cette routine « création d’une souricière ».
L’exemple suivant utilise les fonctions SetTimer et KillTimer pour intercepter l’entrée de la souris.
SetTimer crée un minuteur qui envoie un message WM_TIMER toutes les 10 secondes. Chaque fois que l’application reçoit un message WM_TIMER , elle enregistre l’emplacement du pointeur de la souris. Si l’emplacement actuel est identique à l’emplacement précédent et que la fenêtre main de l’application est réduite, l’application déplace le pointeur de la souris vers l’icône. Lorsque l’application se ferme, KillTimer arrête le minuteur.
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.
//
}
Bien que l’exemple suivant montre également comment intercepter l’entrée de la souris, il traite le message WM_TIMER via la fonction de rappel définie par l’application MyTimerProc, plutôt que par le biais de la file d’attente de messages de l’application.
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;
}
}
}
Découvrez comment automatiser le mouvement de la souris, les clics, la frappe et l’appui sur des touches simulés dans Power Automate. Découvrez également comment sélectionner et rechercher des images ou des zones sur l’écran.