|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Using Timer Functions to Create a Mousetrap
Sometimes it is necessary to prevent more input while you have a cursor on the screen. One way to accomplish this is to create a special routine that traps mouse input until a specific event occurs. Many developers refer to this routine as "building a mousetrap."
The following example uses the SetTimer and KillTimer functions to create a simple mousetrap. SetTimer creates a timer that sends a WM_TIMER message every 10 seconds. Each time the application receives a WM_TIMER message, it records the cursor location. If the current location is the same as the previous location and the application's main window is minimized, the application moves the cursor to the icon. When the application closes, KillTimer stops the timer.
HICON hIcon1; // icon handle POINT ptOld; // previous cursor location UINT uResult; // SetTimer's return value HINSTANCE hinstance; // handle of 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 of 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 of main window UINT message, // type of message UINT wParam, // additional information
LONG lParam) // additional information { HDC hdc; // handle of 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. // }
Although the following example also creates a mousetrap, it processes the WM_TIMER message through the application-defined callback function MyTimerProc, rather than through the application's message queue.
UINT uResult; // SetTimer's return value HICON hIcon1; // icon handle POINT ptOld; // previous cursor location HINSTANCE hinstance; // handle of 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 of 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 of main window UINT message, // type of message UINT wParam, // additional information LONG lParam) // additional information
{ HDC hdc; // handle of 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 of 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; } } }
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Использование Таймера Функционирует, чтобы Создавать Мышеловку
Иногда необходимо должно предохранить более вклад тогда как у вас есть курсор на экране. Один путь выполнять это должно создать специальную программу, которая перехватывает вклад мыши пока специфический случай не произойдет. Много разработчиков ссшлются на эту программу как "построение мышеловки."
Следующий пример использует SetTimer и функции KillTimer, чтобы создавать простую мышеловку. SetTimer СОЗДАЕТ таймер, который посылает сообщение WM_TIMER каждые 10 секунд. Всякий раз, когда приложение получает сообщение WM_TIMER, оно записывает позицию курсора. Если текущая позиция такая же как и предшествующая позиция и прикладное основное окно минимизировано, приложение перемещает курсор на икону. Когда приложение закрывает, KillTimer останавливает таймер.
HICON hIcon1; // иконная ТОЧКА ручки ptOld; // предшествующая позиция курсора UINT uResult; // ОБРАТНАЯ величина SetTimer's hinstance HINSTANCE; // ручка текущего примера // // Выполните прикладную инициализацию здесь. // wc.hIcon = LoadIcon(hinstance, MAKEINTRESOURCE(400)); wc.hCursor = LoadCursor(hinstance, MAKEINTRESOURCE(200)); // Запись начальная позиция курсора. GetCursorPos(&ptOld); // Установленный таймер для мышеловки.
uResult = SetTimer(hwnd, // Ручка основного окна IDT_MOUSETRAP, // таймерного идентификатора 10000, // 10- второй интервал (TIMERPROC) НЕДЕЙСТВИТЕЛЬНЫЙ); // никакой таймерный возврат если (uResult == 0) { ErrorHandler(ТАЙМЕР "No доступен."); } ДОЛГО (ДЛИНОЙ) APIENTRY MainWndProc( HWND hwnd, // ручка основного сообщения окна UINT, // типа сообщения UINT wParam, // дополнительной информации
ДОЛГО (ДЛИНОЙ) lParam) // дополнительная информация { hdc HDC; // ручка контекстной ТОЧКИ устройства пт; // текущая позиция rc курсора RECT; // позиция минимизированного окна ключ (сообщение) { // // Процесс другие сообщения. // случай WM_TIMER: // Если окно минимизировано, сравните течение // позиция курсора с один с 10 секунд // раньше. Если позиция курсора не изменилась бы,
// переместите курсор на иконку. если (IsIconic(hwnd)) { GetCursorPos(&pt); если ((pt.x == ptOld.x) && (pt.y == ptOld.y)) { GetWindowRect(hwnd, &rc); SetCursorPos(rc.left, rc.top); } еще { ptOld.x = pt.x; ptOld.y = pt.y; }
} возврат 0; случай WM_DESTROY: // Уничтожьте таймер. KillTimer(hwnd, IDT_MOUSETRAP); PostQuitMessage(0); прерывание; // // Процесс другие сообщения. // }
Хотя следующий пример также создает мышеловку, он обрабатывает сообщение WM_TIMER через определенную прикладную функцию возврата MyTimerProc, а не через прикладную очередь сообщения.
UINT uResult; // ОБРАТНАЯ величина SetTimer's HICON hIcon1; // иконная ТОЧКА ручки ptOld; // предшествующая позиция hinstance курсора HINSTANCE; // ручка текущего примера // // Выполните прикладную инициализацию здесь. // wc.hIcon = LoadIcon(hinstance, MAKEINTRESOURCE(400)); wc.hCursor = LoadCursor(hinstance, MAKEINTRESOURCE(200)); // Запись текущая позиция курсора. GetCursorPos(&ptOld); // Установленный таймер для мышеловки.
uResult = SetTimer(hwnd, // Ручка основного окна IDT_MOUSETRAP, // таймерного идентификатора 10000, // 10- второй интервал (TIMERPROC) MyTimerProc); // таймерный возврат если (uResult == 0) { ErrorHandler(ТАЙМЕР "No доступен."); } ДОЛГО (ДЛИНОЙ) APIENTRY MainWndProc( HWND hwnd, // ручка основного сообщения окна UINT, // тип сообщения UINT wParam, // дополнительная информация ДОЛГО (ДЛИНОЙ) lParam) // дополнительная информация
{ hdc HDC; // ручка контекста устройства ключ (сообщение) { // // Процесс другие сообщения. // случай WM_DESTROY: // Уничтожать таймер. KillTimer(hwnd, IDT_MOUSETRAP); PostQuitMessage(0); прерывание; // // Процесс другие сообщения. // } // MyTimerProc - определенная прикладная функция возврата эти // сообщения процессов WM_TIMER.
ПУСТОТА CALLBACK MyTimerProc( HWND hwnd, // РУЧКА окна для таймерного сообщения сообщений UINT, // сообщения WM_TIMER UINT idTimer, // таймерного идентификатора DWORD dwTime) // текущее системное время { rc RECT; ТОЧКА пт; // Если окно минимизировано, сравните течение // позиция курсора с один с 10 секунд раньше. // Если позиция курсора не изменилась бы, переместите // курсор на иконку.
если (IsIconic(hwnd)) { GetCursorPos(&pt); если ((pt.x == ptOld.x) && (pt.y == ptOld.y)) { GetWindowRect(hwnd, &rc); SetCursorPos(rc.left, rc.top); } еще { ptOld.x = pt.x; ptOld.y = pt.y; } } }
|
|
|
|
| |