有没有办法检测Windows进程是否空闲?
idle表示特定应用程序的进程未处理任何内容(应用程序正在等待用户输入)。
欢呼声
答案 0 :(得分:1)
您可以使用WH_FOREGROUNDIDLE
放置一个钩子SetWindowsHookEx答案 1 :(得分:0)
如果您的意思是想要检测应用程序是否满意并接收消息(用户输入),请检查此功能的返回:
SendMessageTimeout(HwndInQuestion, WM_NULL, 0, 0, SMTO_ABORTIFHUNG, 10);
只需将超时(示例中为10毫秒)设置为您认为合理使用的内容即可。
答案 2 :(得分:0)
我在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味精= 770930