2011-08-03 64 views
2

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

空闲表示当特定应用程序的进程没有处理任何东西时(应用程序正在等待userinput)。

欢呼

+0

你的意思是用户输入?它是一个命令行应用程序阻止getc(),还是你的意思是一个GUI应用程序什么都不做,只是等到按下按钮? – Bart

+0

[如何检测进程/线程何时等待用户输入]可能的重复(http://stackoverflow.com/questions/6911498/how-to-detect-when-a-process-thread-is-waiting-用户输入) – Hasturkun

+0

hey bart,确切地说,“Gui应用程序无所作为,只是等待按钮被按下” – paktrick

回答

1

可以挂上了钩SetWindowsHookEx与WH_FOREGROUNDIDLE

+0

嗨cProgramming感谢快速重播,我目前有一个HWND,我怎么能HWND钩到windowHookex? – paktrick

+0

您应该告诉我们更多关于您的应用程序的信息。 SetWindowsHookEx可以放在一个线程上,但如果你有一个HWND,还有其他方法可以处理这个问题。像使用GWL_WNDPROC的SetWindowLong一样,看看你什么时候没有收到消息,或者如果你正在使用MFC,就会有一条消息,名为WM_KICKIDLE,这是一个MFC在对话空闲时发送的消息。 – cprogrammer

+0

我会尝试重新说一句。以安装应用程序为例: - 用户运行setup.exe,然后输入一些设置(配置程序),之后会有一些程序将开始安装。程序结束后,其程序应该是闲置吗?等待用户输入,这是我想弄明白的。 – paktrick

0

如果你的意思是你要检测如果应用程序是快乐和接收消息(用户输入)检查这个函数的返回:

SendMessageTimeout(HwndInQuestion, WM_NULL, 0, 0, SMTO_ABORTIFHUNG, 10); 

只需将超时(示例中为10毫秒)设置为您认为适合您使用的情况。

+0

嗨noelicus,我想检测何时一个特定的应用正在请求用户输入。 – paktrick

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

+0

p.s.看起来这个主题在vista/win7中变得更加困难,因为SetWindowsHookEx显然需要高权限(UAC)。 –