我在 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 );
}
.) 在主框架的末尾设置窗口挂钩 ::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