Краткое изложение того, что я нашел по этой теме для случая MFC, когда вы хотите получать уведомления, когда процесс простаивает (выполнить некоторую фоновую работу и т. Д.), Но не в режиме опроса / ожидания
(имена переменных - это предложения):
-> Если это приложение MFC без модальных диалогов:
add ON_MESSAGE_VOID(WM_IDLEUPDATECMDUI,OnIdleUpdateCmdUI) to message map together
with the method afx_msg void OnIdleUpdateCmdUI()
-> Если это диалог в приложении MFC:
add ON_MESSAGE(WM_KICKIDLE, OnKickIdle) to message map together
with the method afx_msg LRESULT OnKickIdle(WPARAM wParam, LPARAM lParam);
-> Если вы хотите, чтобы оба (приложение и диалоговые окна):
.) Добавили открытую переменную-член в основной фрейм (также возможна статическая глобальная переменная)
HOOKPROC m_detectIdleHook
.) добавить прототип метода в заголовочный файл основного фрейма
friend LRESULT CALLBACK OnForeGroundIdle( int nCode, WPARAM wParam, LPARAM lParam )
с этим содержимым (обратите внимание, что он не является функцией-членом основного фрейма!)
LRESULT CALLBACK OnForeGroundIdle( int nCode, WPARAM wParam, LPARAM lParam )
{
// Do/check stuff in idle time here
return ::CallNextHookEx( (HHOOK)((CMyMainFrame*)AfxGetMainWnd())->m_detectIdleHook, nCode, wParam, lParam );
}
.) setкрюк окна в конце основного фрейма :: OnCreate
m_detectIdleHook = (HOOKPROC)SetWindowsHookEx( WH_FOREGROUNDIDLE,
OnForeGroundIdle,
NULL,
::GetCurrentThreadId());
.) В конце, когда вы закончите, отцепите окно в деконструкторе основного фрейма
UnhookWindowsHookEx((HHOOK)m_detectIdleHook);
Нетиз этих решений будет работать, если приложение не активно (другоеПриложение имеет фокус).Единственное решение, которое я вижу здесь, состоит в том, чтобы использовать WM_TIMER и проверить состояние бездействия с помощью WaitForInputIdle (http://msdn.microsoft.com/en-us/library/ms687022%28VS.85%29.aspx), но это приведет к определенной зависимости интервала опроса.
Источники:
- http://www.drdobbs.com/184416462
- http://www.codeguru.com/forum/showthread.php?t=199148
- http://www.codeproject.com/KB/dialog/idledialog.aspx?msg=770930