检测进程是否空闲

时间:2011-08-03 10:59:46

标签: c window jna

有没有办法检测Windows进程是否空闲?

idle表示特定应用程序的进程未处理任何内容(应用程序正在等待用户输入)。

欢呼声

3 个答案:

答案 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