Периодически вызываемый GetProcessTime выдаёт одно и то же значение

178
02 февраля 2018, 22:16

Добрый день. Поставил перед собой задачу написать маленький органайзер, отслеживающий как долго работают те или иные окна, сделал через отслеживание времени работы процесса, отвечающего за окно, следующей функцией (которая требуется для EnumWindows):

BOOL CALLBACK EnumWindowsProc(HWND hWnd, long lParam)
{
wchar_t buff[255];
if ( IsWindowVisible(hWnd) )
{
    //PID -> Handle
    DWORD PID;
    GetWindowThreadProcessId( hWnd, &PID );
    HANDLE  pHandle = OpenProcess( PROCESS_QUERY_LIMITED_INFORMATION, FALSE, PID );
    //Process Time in strange format
    FILETIME strangeTime, unuse1, unuse2, unuse3;
    GetProcessTimes( pHandle, &unuse1, &unuse2, &unuse3, &strangeTime );
    //Process time in "normal" format
    SYSTEMTIME normalTime;
    FileTimeToSystemTime( &strangeTime, &normalTime );
    InternalGetWindowText( hWnd, buff, 254 );
    if( ((std::wstring)buff).size()>1 )
    {
        printf("%ls %u:%u:%u\n", buff, normalTime.wHour, normalTime.wMinute, normalTime.wSecond);
    }
}
return TRUE;
}

Собственно EnumWindows вызывается каждые 5 секунд, но время каждый раз одинаковое выводится.

UPD: Есть похожий топик на англоязычном стаке: https://stackoverflow.com/questions/18107908/getprocesstimes-called-periodically-returns-the-same-results . Но там немного другая ситуация (вдруг кого натолкнёт)

UPD: проблема в том, какой процесс отсчитывается, если вывести все процессы и считать их время, то всё хорошо, код:

void PrintProcessNameAndID( DWORD processID )
{
TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>"); //Just like char, but UNICODE (maybe)Оно
// Get a handle to the process.
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
                               PROCESS_VM_READ, //Параметры доступа
                               TRUE, //Наследование ID от открытого процесса
                               processID ); //Открываем по ID
FILETIME strangeTime, unuse1, unuse2, unuse3;
GetProcessTimes( hProcess, &unuse1, &unuse2, &unuse3, &strangeTime );
SYSTEMTIME normalTime;
FileTimeToSystemTime( &strangeTime, &normalTime );
// Get the process name.
if (NULL != hProcess )
{
    HMODULE hMod;
    DWORD cbNeeded;
    if ( EnumProcessModulesEx( hProcess, //"указатель" на процесс
                             &hMod, //Сюда мы кидаем всё, из чего состоит процесс (модули)
                             sizeof(hMod),
                             &cbNeeded, LIST_MODULES_ALL)  ) //Общий объём модулей (с учётом которые не поместились)
    {
        GetModuleBaseName( hProcess, //"указатель" на процесс
                           hMod, //рассматриваемый модуль
                           szProcessName, //сюда кладём имя
                           sizeof(szProcessName)/sizeof(TCHAR) ); //размер в символах
    }
}
// Print the process name and identifier.
_tprintf( TEXT("%s  (PID: %u) %u:%u:%u\n"), szProcessName, processID, normalTime.wHour, normalTime.wMinute, normalTime.wSecond ); // printf для TCHAR
// Release the handle to the process.
CloseHandle( hProcess );
}
int main( void )
{
double time_counter = 0;
clock_t this_time = clock();
clock_t last_time = this_time;
while(true)
{
    this_time = clock();
    time_counter += (double)(this_time - last_time);
    last_time = this_time;
    if(time_counter > (double)(NUM_SECONDS * CLOCKS_PER_SEC))
    {
        // Get the list of process identifiers.
        time_counter -= (double)(NUM_SECONDS * CLOCKS_PER_SEC);
        DWORD aProcesses[1024], //PID
                cbNeeded,
                cProcesses;
        unsigned int i;
        if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
        {
            return 1;
        }

        // Calculate how many process identifiers were returned.
        cProcesses = cbNeeded / sizeof(DWORD);
        // Print the name and process identifier for each process.
        for ( i = 0; i < cProcesses; i++ )
            if( aProcesses[i] != 0 )
                PrintProcessNameAndID( aProcesses[i] );
        printf("\n");
    }
}
return 0;
}

Сейчас сверю PID и напишу конечную проблему

READ ALSO
QPushButton - подсветка при наведении - не работает в винде

QPushButton - подсветка при наведении - не работает в винде

Для QPushButton задаю иконку с 3мя установленными картинками: Normal, Disabled, ActiveПосле сборки и запуска на linux, всё отрабатывает как ожидается - при наведении...

173
Синхронная обработка запросов через boost::asio

Синхронная обработка запросов через boost::asio

Первая итерация срабатывает превосходно, ввожу строку - получаю ответ, а второй раз как бы "зависает" - те

201
миллион исходящих TCP-соединений [требует правки]

миллион исходящих TCP-соединений [требует правки]

"C++ Windows" миллион исходящих TCP-соединений как обойти ограничени 65535 ?

198