Re[2]: Непонятный ключ HKEY_PERFORMANCE_DATA
От: NNN7 Украина  
Дата: 05.05.14 18:18
Оценка:
Здравствуйте, 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")
#define COMBOBOX 1
#define LISTBOX 2
HWND CB,LB;

 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);
                   return TRUE;
                }

               if(LOWORD(wpar)==SELECT)
               {
                GetDlgItemText(hwnd,COMBOBOX,(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_INITDIALOG:
    //Создаём список счётчиков производительности
    CB=CreateWindow((LPCSTR)"Combobox",(LPCSTR)"Combo1", CBS_DROPDOWNLIST|WS_CHILD|WS_VISIBLE,90,360,200,300, hwnd, (HMENU)COMBOBOX,0, NULL); 
    //Заносим возможные варианты  счётчиков
    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=CreateWindow("Listbox", NULL,WS_VISIBLE|WS_CHILD| WS_VSCROLL | WS_TABSTOP |WS_BORDER , 90,140,300,200, hwnd, (HMENU)LISTBOX, 0, NULL); 
   //Создать запрос 
   Status = PdhOpenQueryW(NULL, 0, &Query);
   if(Status!=ERROR_SUCCESS)
   {
       MessageBox(hwnd,(LPSTR)"open-NOT OK",(LPCSTR)"",MB_OK);
   }
   //Добавить счётчик в запрос
    Status = PdhAddEnglishCounterW(Query, L"\\Processor(_Total)\\% Privileged Time", 0, &Counter);
    if (Status != ERROR_SUCCESS)
    {
        MessageBox(hwnd,(LPSTR)"add-NOT OK",(LPCSTR)"",MB_OK);
    }
   /*Собирает текущее необработанное значение данных для всех счетчиков в указанном запросе
    и обновляет код состояния каждого счетчика*/
    Status = PdhCollectQueryData(Query);
    if (Status != ERROR_SUCCESS)
    {
        MessageBox(hwnd,(LPSTR)"collect-NOT OK",(LPCSTR)"",MB_OK);
    }
    Sleep(1000);
    Status = PdhCollectQueryData(Query);
    if (Status != ERROR_SUCCESS)
    {
        MessageBox(hwnd,(LPSTR)"collect-NOT OK",(LPCSTR)"",MB_OK);
    }
    /*Вычислить отображаемое  значение для указанного счетчика.*/
    Status = PdhGetFormattedCounterValue(Counter,PDH_FMT_DOUBLE,&CounterType,&DisplayValue);
    if(Status!=ERROR_SUCCESS)
    {
        MessageBox(hwnd,(LPSTR)"formatted-NOT OK",(LPCSTR)"",MB_OK);
    }
        /*закрываем запрос*/
    if (Query){PdhCloseQuery(Query);}

    //НОВЫЙ ЗАПРОС!!!
     Status2 = PdhOpenQueryW(NULL, 0, &Query2);
   if(Status2!=ERROR_SUCCESS)
   {
       MessageBox(hwnd,(LPSTR)"open-NOT OK",(LPCSTR)"",MB_OK);
   }
   //Добавить счётчик в запрос
    Status2 = PdhAddEnglishCounterW(Query2, L"\\Processor(_Total)\\% User Time", 0, &Counter2);
    if (Status2 != ERROR_SUCCESS)
    {
        MessageBox(hwnd,(LPSTR)"add-NOT OK",(LPCSTR)"",MB_OK);
    }
   /*Собирает текущее необработанное значение данных для всех счетчиков в указанном запросе
    и обновляет код состояния каждого счетчика*/
    Status2 = PdhCollectQueryData(Query2);
    if (Status2 != ERROR_SUCCESS)
    {
        MessageBox(hwnd,(LPSTR)"collect-NOT OK",(LPCSTR)"",MB_OK);
    }
    Sleep(1000);
    Status2 = PdhCollectQueryData(Query2);
    if (Status2 != ERROR_SUCCESS)
    {
        MessageBox(hwnd,(LPSTR)"collect-NOT OK",(LPCSTR)"",MB_OK);
    }
    /*Вычислить отображаемое  значение для указанного счетчика.*/
    Status2 = PdhGetFormattedCounterValue(Counter2,PDH_FMT_DOUBLE,&CounterType2,&DisplayValue2);
    if(Status2!=ERROR_SUCCESS)
    {
        MessageBox(hwnd,(LPSTR)"formatted-NOT OK",(LPCSTR)"",MB_OK);
    }
        /*закрываем запрос*/
    if (Query2){PdhCloseQuery(Query2);}
 }
   return 0;   
}


Возник такой вопрос : а как сделать , чтобы выводимые значения обновлялись как-то ? сами или по нажатию кнопки .. Думаю,думаю..никак не могу сообразить .


Эх, ещё бы с функциями реестра как-то разобраться..
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.