Здравствуйте, Pavel Dvorkin. Вот ещё немного переделал код:
#include <Windows.h>
#include "resource.h"
#include <string.h>
#include <pdh.h>
#include <pdhmsg.h>
#include <iostream>
#include <stdio.h>
using namespace std;
#pragma comment(lib, "pdh.lib")
HWND CB,LB;
int func(HWND hwnd);
wchar_t str [51]; //буфер
TCHAR buf[20] = {0}; //для вывода
TCHAR buf2 [20] ={0};
PDH_STATUS Status;
PDH_STATUS Status2;
HQUERY Query2=NULL;
HQUERY Query = NULL;
HCOUNTER Counter;
DWORD CounterType;
PDH_FMT_COUNTERVALUE DisplayValue;
HCOUNTER Counter2;
DWORD CounterType2;
PDH_FMT_COUNTERVALUE DisplayValue2;
BOOL WINAPI WndProc (HWND ,UINT ,WPARAM ,LPARAM );
//главня функция
int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst,LPSTR CmdLine,int CmdShow)
{
//создание диалогового окна главным окном
int db;
db=DialogBox (hInst,MAKEINTRESOURCE(IDD_DIALOG1),GetDesktopWindow(),WndProc);
}
BOOL WINAPI WndProc (HWND hwnd,UINT uMsg,WPARAM wpar,LPARAM lpar )
{
switch (uMsg)
{
case WM_COMMAND:
//Если нажата кнопка Quit, тозакрываем окно
if (LOWORD(wpar)==QUIT)
{ EndDialog(hwnd,NULL);
KillTimer(hwnd,1);
return TRUE;
}
if(LOWORD(wpar)==SELECT)
{
GetDlgItemText(hwnd,COMBO,(LPSTR)str,51);
if(lstrcmp((LPCSTR)str,"% Privileged Time") == 0)
{ sprintf_s(buf, TEXT("%lf"), DisplayValue.doubleValue);
SendMessage(LB, LB_ADDSTRING, 1, ( LPARAM)buf);
}
if(lstrcmp((LPCSTR)str,"% User time") == 0)
{
sprintf_s(buf2, TEXT("%lf"), DisplayValue2.doubleValue);
SendMessage(LB, LB_ADDSTRING, 1, ( LPARAM)buf2);
}
}
break;
case WM_TIMER:
func(hwnd);
break;
case WM_INITDIALOG:
//установка таймера
SetTimer(hwnd,1,1000,NULL);
//Создаём список счётчиков производительности
CB=GetDlgItem(hwnd,COMBO);
//Заносим возможные варианты счётчиков
SendMessage(CB, CB_ADDSTRING, 0, (LPARAM)"% User time");
SendMessage(CB, CB_ADDSTRING, 0, (LPARAM)"% Processor time");
SendMessage(CB, CB_ADDSTRING, 0, (LPARAM)"% Privileged Time");
//Создаём список для вывода значения счётчиков
LB=GetDlgItem(hwnd,LIST);
//Создать запрос
Status = PdhOpenQueryW(NULL, 0, &Query);
if(Status!=ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"open-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
//Добавить счётчик в запрос
Status = PdhAddEnglishCounterW(Query, L"\\Processor(_Total)\\% Privileged Time", 0, &Counter);
if (Status != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"add-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*Собирает текущее необработанное значение данных для всех счетчиков в указанном запросе
и обновляет код состояния каждого счетчика*/
Status = PdhCollectQueryData(Query);
if (Status != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"collect-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
Sleep(1000);
Status = PdhCollectQueryData(Query);
if (Status != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"collect-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*Вычислить отображаемое значение для указанного счетчика.*/
Status = PdhGetFormattedCounterValue(Counter,PDH_FMT_DOUBLE,&CounterType,&DisplayValue);
if(Status!=ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"formatted-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*закрываем запрос*/
if (Query){PdhCloseQuery(Query);}
//НОВЫЙ ЗАПРОС!!!
Status2 = PdhOpenQueryW(NULL, 0, &Query2);
if(Status2!=ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"open-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
//Добавить счётчик в запрос
Status2 = PdhAddEnglishCounterW(Query2, L"\\Processor(_Total)\\% User Time", 0, &Counter2);
if (Status2 != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"add-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*Собирает текущее необработанное значение данных для всех счетчиков в указанном запросе
и обновляет код состояния каждого счетчика*/
Status2 = PdhCollectQueryData(Query2);
if (Status2 != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"collect-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
Sleep(1000);
Status2 = PdhCollectQueryData(Query2);
if (Status2 != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"collect-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*Вычислить отображаемое значение для указанного счетчика.*/
Status2 = PdhGetFormattedCounterValue(Counter2,PDH_FMT_DOUBLE,&CounterType2,&DisplayValue2);
if(Status2!=ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"formatted-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*закрываем запрос*/
if (Query2){PdhCloseQuery(Query2);}
}
return 0;
}
//функция
int func(HWND hwnd)
{
//Создаём
LB=GetDlgItem(hwnd,LIST);
//очищаем :
SendMessage(LB, LB_RESETCONTENT, 0, 0);
//Создать запрос
Status = PdhOpenQueryW(NULL, 0, &Query);
if(Status!=ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"open-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
//Добавить счётчик в запрос
Status = PdhAddEnglishCounterW(Query, L"\\Processor(_Total)\\% Privileged Time", 0, &Counter);
if (Status != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"add-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*Собирает текущее необработанное значение данных для всех счетчиков в указанном запросе
и обновляет код состояния каждого счетчика*/
Status = PdhCollectQueryData(Query);
if (Status != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"collect-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
Sleep(1000);
Status = PdhCollectQueryData(Query);
if (Status != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"collect-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*Вычислить отображаемое значение для указанного счетчика.*/
Status = PdhGetFormattedCounterValue(Counter,PDH_FMT_DOUBLE,&CounterType,&DisplayValue);
if(Status!=ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"formatted-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*закрываем запрос*/
if (Query){PdhCloseQuery(Query);}
//НОВЫЙ ЗАПРОС!!!
Status2 = PdhOpenQueryW(NULL, 0, &Query2);
if(Status2!=ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"open-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
//Добавить счётчик в запрос
Status2 = PdhAddEnglishCounterW(Query2, L"\\Processor(_Total)\\% User Time", 0, &Counter2);
if (Status2 != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"add-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*Собирает текущее необработанное значение данных для всех счетчиков в указанном запросе
и обновляет код состояния каждого счетчика*/
Status2 = PdhCollectQueryData(Query2);
if (Status2 != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"collect-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
Sleep(1000);
Status2 = PdhCollectQueryData(Query2);
if (Status2 != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"collect-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*Вычислить отображаемое значение для указанного счетчика.*/
Status2 = PdhGetFormattedCounterValue(Counter2,PDH_FMT_DOUBLE,&CounterType2,&DisplayValue2);
if(Status2!=ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"formatted-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*закрываем запрос*/
if (Query2){PdhCloseQuery(Query2);}
GetDlgItemText(hwnd,COMBO,(LPSTR)str,51);
if(lstrcmp((LPCSTR)str,"% Privileged Time") == 0)
{ sprintf_s(buf, TEXT("%lf"), DisplayValue.doubleValue);
SendMessage(LB, LB_ADDSTRING, 1, ( LPARAM)buf);
}
if(lstrcmp((LPCSTR)str,"% User time") == 0)
{
sprintf_s(buf2, TEXT("%lf"), DisplayValue2.doubleValue);
SendMessage(LB, LB_ADDSTRING, 1, ( LPARAM)buf2);
}
}
Уже немного похоже на правду , хоть новые значения появляются , но смущает , что при выборе счётчика сначала заносятся 2 одинаковых значения ( а должно одно) , потом они меняются на другое и так далее (переключаются каждую секунду) и если выбрать какой-то другой счётчик , то результат 1-го счётчика стирается. А нужно- чтобы он сохранялся на своём месте и дальше продолжал меняться.
Что не так написал ?