Re[2]: Непонятный ключ HKEY_PERFORMANCE_DATA
От: NNN7 Украина  
Дата: 05.05.14 16:19
Оценка:
Здравствуйте, Pavel Dvorkin.
Спасибо , с этим примером я разобрался , почитал , что к чему . Убрал интерфейс , попробовал в консоли всё это сделать для некоторых счётчиков — всё получилось .
Мне теперь нужно в графическом виде это представить , а именно записать значение счётчика (какого-либо ) в ListBox . Всё считает , все функции работают , но не могу разобраться , как конвертировать результат в строку — для вывода .

Вот мой код:


#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;
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 )
{

 wchar_t str [51];  //буфер
 PDH_STATUS Status;
 HQUERY Query = NULL;
 HCOUNTER Counter;
 DWORD CounterType;
 SYSTEMTIME SampleTime;
 PDH_FMT_COUNTERVALUE DisplayValue;

 char buf [50];

  switch (uMsg)
 {

case WM_COMMAND:
               //Если нажата кнопка Quit, тозакрываем окно
               if (LOWORD(wpar)==QUIT)
                {EndDialog(hwnd,NULL);
                return TRUE;
               }

              break;

case WM_INITDIALOG:
    //Создаём список лет:
        CB=CreateWindow((LPCSTR)"Combobox",(LPCSTR)"Combo1", CBS_DROPDOWNLIST|WS_CHILD|WS_VISIBLE/*|WS_VSCROLL|CBS_DROPDOWNLIST*/,
        90,360,200,300, hwnd, (HMENU)COMBOBOX,0, NULL); 
        
        //Заносим значения лет:
        SendMessage(CB, CB_ADDSTRING, 0, (LPARAM)"% Use time");
        SendMessage(CB, CB_ADDSTRING, 0, (LPARAM)"% Processor time");
        SendMessage(CB, CB_ADDSTRING, 0, (LPARAM)"% Privileged Time");


   //Создаём запрос 
   Status = PdhOpenQueryW(NULL, 0, &Query);  //запрос на использование счётчиков производительности
   if(Status==ERROR_SUCCESS)
   {MessageBox(hwnd,(LPSTR)"open-OK",(LPCSTR)"",MB_OK);}

    /*Добавить счётчик в запрос*/
 
    Status = PdhAddEnglishCounterW(Query, L"\\Processor(_Total)\\% Privileged Time", 0, &Counter);
    if (Status == ERROR_SUCCESS)
    {MessageBox(hwnd,(LPSTR)"add-OK",(LPCSTR)"",MB_OK);}

    /*Собирает текущее необработанное значение данных для всех счетчиков в указанном запросе
    и обновляет код состояния каждого счетчика*/
    Status = PdhCollectQueryData(Query);
    if (Status == ERROR_SUCCESS)
      {MessageBox(hwnd,(LPSTR)"collect-OK",(LPCSTR)"",MB_OK);
      }
 
    Sleep(1000);
 
    Status = PdhCollectQueryData(Query);
    if (Status == ERROR_SUCCESS)
    {MessageBox(hwnd,(LPSTR)"collect-OK",(LPCSTR)"",MB_OK);
    }
   
    
     /*Вычислить отображаемое  значение для указанного счетчика.*/
    Status = PdhGetFormattedCounterValue(Counter,
        PDH_FMT_DOUBLE,
        &CounterType,
        &DisplayValue);
    if(Status==ERROR_SUCCESS)
    {MessageBox(hwnd,(LPSTR)"formatted-OK",(LPCSTR)"",MB_OK);
    }

    //вывод результата:

        
        LB=CreateWindow("Listbox", NULL, 
        WS_VISIBLE|WS_CHILD| WS_VSCROLL | WS_TABSTOP |WS_BORDER ,
        90,140,300,200, hwnd, (HMENU)LISTBOX, 0, NULL); 
        
        wsprintf(buf, "%f", DisplayValue);
        SendMessage(LB, LB_ADDSTRING, 1, ( LPARAM)buf);

     if (Query)
    {
        PdhCloseQuery(Query);
    }
 }
   return 0;   
}



Вот место , где пытаюсь занести в ListBox :


 LB=CreateWindow("Listbox", NULL, 
        WS_VISIBLE|WS_CHILD| WS_VSCROLL | WS_TABSTOP |WS_BORDER ,
        90,140,300,200, hwnd, (HMENU)LISTBOX, 0, NULL); 
        
        wsprintf(buf, "%f", DisplayValue);
        SendMessage(LB, LB_ADDSTRING, 1, ( LPARAM)buf);


Но на конвертацию значение не реагирует .

Как это можно сделать ? Помогите , пожалуйста .
Заранее спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.