Обнаружение, если процесс простаивает - PullRequest
2 голосов
/ 03 августа 2011

Есть ли способ определить, простаивает ли процесс Windows?

idle Означает, что процесс определенного приложения ничего не обрабатывает (приложение ожидает ввода пользователя).

cheers

Ответы [ 3 ]

1 голос
/ 03 августа 2011

Вы можете поставить крюк SetWindowsHookEx с WH_FOREGROUNDIDLE

0 голосов
/ 17 августа 2011

Краткое изложение того, что я нашел по этой теме для случая 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

0 голосов
/ 03 августа 2011

Если вы имеете в виду, что вы хотите определить, удовлетворено ли приложение, и получать сообщения (пользовательский ввод), проверьте возврат этой функции:

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

Просто установите время ожидания (10 мс в примере) на то, чтовы считаете целесообразным для вашего использования.

...