Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.11.2013, 00:32   #21
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Таймер работает на то окно, на которое запущен.
Для перерсовки окна используйте InvalidateRect(hWnd, NULL, FALSE) где hWnd - это нужное вам окно.
А можно поподробней? Вставил функцию в WM_TIMER:
Код:
case WM_TIMER:
			switch(wParam)
			{
				case MONITOR_TIMER:
					MessageBox(NULL, TEXT("WORKS"), TEXT("WORKS!"), MB_OK);
					EnumChildWindows(hWnd, EnumChildProc, 0);
					MonTab(hWnd);
					InvalidateRect((((LPNMHDR)lParam)->hwndFrom), NULL, FALSE);
					//UpdateWindow((((LPNMHDR)lParam)->hwndFrom));
					break;
			}
			break;
И как запускается таймер:
Код:
case 5:
								//MessageBox(NULL, TEXT("WORKS"), TEXT("WORKS!"), MB_OK);
								
								InvalidateRect((((LPNMHDR)lParam)->hwndFrom), NULL, FALSE);
								SetTimer((((LPNMHDR)lParam)->hwndFrom), MONITOR_TIMER, 1000, NULL);
								/*UpdateWindow((((LPNMHDR)lParam)->hwndFrom));
								MonTab((((LPNMHDR)lParam)->hwndFrom));*/
								break;
Но дело в том, что ели указывать окно вкладки, то до таймера всё равно не доходит сообщения, т.е. не выполняется. Что же я делаю не так?
hvz- вне форума Ответить с цитированием
Старый 21.11.2013, 18:02   #22
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Таймер запускайте в главном окне а главное окно пусть делает InvalidateRect для окна активной вкладки.
waleri вне форума Ответить с цитированием
Старый 21.11.2013, 23:12   #23
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Таймер запускайте в главном окне а главное окно пусть делает InvalidateRect для окна активной вкладки.
Т.е. юзать hWnd в процедуре окна, но как вытягивать именно вкладку?
Ведь на входе hwndFrom - это дескриптор окна от которого получили сообщение, в вашем предлагаемом случае - это будет главное окно.
Нужно сделать дескриптор окна вкладок глобальным что бы всегда иметь к нему доступ? И почему мой описанный метод не работает? Ведь вроде всё логично - получаю сообщение от окна вкладки, на это окно вешаю счётчик, но таймер не работает. Почему?
Так же не понимаю ваш вариант - получается, я всё равно буду рисовать в главном окне а окно вкладок делать не валидным? Зачем?

Заранее прошу прощения, до меня просто не доходит суть и смысл, не могли бы вы подробно ответить на мои вопросы?
Спасибо!
hvz- вне форума Ответить с цитированием
Старый 22.11.2013, 07:46   #24
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Я нигде не сказал "рисовать". В главном окне только указывается вкладке, что вкладка должна перерисоваться а дальше это забота вкладки.

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

По поводу почему не работает - не вникал, но откудя в обработчике WM_TIMER берется LPNMHDR? А зачем там EnumChildProc? Отслеживайте коды ошибок - правильные ли у вас дескрипторы окон и тд.
waleri вне форума Ответить с цитированием
Старый 10.12.2013, 02:15   #25
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию

Доброго дня суток!
Вобщем, заставить работать таймер у меня не получилось, и я пришел к выводу, что нужно поменять структуру приложения и используемые технологии.
На счёт структуры пока вопросов нет, а вот на счёт технологий - узнал про такую вещь как WMI - как можно на приложении винапи заюзать сие действо? В гугле нашёл только примеры скриптов на VB, но мне хотелось бы использовать всё это в нативном винапи приложении.
И на сколько большую информацию можно вытянуть из реестра? Пока что оттуда беру только название процессора.
hvz- вне форума Ответить с цитированием
Старый 16.12.2013, 04:28   #26
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию

Кое как разобрался с WMI, прикрутил его в проект. Но теперь возник вопрос возвращаемого типа с базы WMI.
Например, запрос "SELECT * FROM Win32_VideoController", берём поле "AdapterRAM". В справке класса поле "AdapterRAM" имеет тип uint32. И при обработке моего запроса функцией(код которой приведён ниже) ничего не происходит. Т.е. далее код не исполняется, скорее всего какая то ошибка вылезает.
Код функции:
Код:
BSTR WMI_GetData(TCHAR* tQuery, TCHAR* tField)
{
    // Подключение к WMI, инициализация COM интерфейса и остальное я пропустил

    // Шаг 6: ------------------------------------------------------------
    // Использовать указатель IWbemServices что бы делать запросы к WMI --

    IEnumWbemClassObject* pEnumerator = NULL;
    hres = pSvc->ExecQuery(
        bstr_t("WQL"), 
        bstr_t(tQuery),
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
        NULL,
        &pEnumerator);
    
    if (FAILED(hres))
    {
		MessageBox(NULL, TEXT("WMI query failed."), TEXT("WMI error!"), MB_OK);
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
    }

    // Шаг 7: ---------------------------------------------
    // Взять данные из запроса в шаге 6 -------------------
 
    IWbemClassObject *pclsObj;
    ULONG uReturn = 0;
	BSTR bstrResult;
    while (pEnumerator)
    {
        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);

        if(0 == uReturn)
        {
            break;
        }

        VARIANT vtProp;

        // Получаем значение свойства
        // tField = TEXT("AdapterRAM")
        hr = pclsObj->Get(tField, 0, &vtProp, 0, 0);
	// Берём результат
        bstrResult = vtProp.bstrVal;

	// Освобождение ресурсов
	//VariantClear(&vtProp);
        //pclsObj->Release();
    }

    // Освобождение ресурсов
    pSvc->Release();
    pLoc->Release();
    pEnumerator->Release();
    pclsObj->Release();
    CoUninitialize();
	return bstrResult;
}
Вызываю так:
Код:
BSTR bstrVcName = WMI_GetData(TEXT("SELECT * FROM Win32_VideoController WHERE Availability = 3"), TEXT("Description")); // Работает, т.к. поле имеет тип string
BSTR bstrVcRAM = WMI_GetData(TEXT("SELECT * FROM Win32_VideoController WHERE Availability = 3"), TEXT("AdapterRAM")); // Не работает, т.к. тип uint32.
Подскажите, как правильно взять данные не типа string и преобразовать в нужную мне строку? Возможно нужно как то применить структуру VARIANT ? Я в замешательстве
hvz- вне форума Ответить с цитированием
Старый 16.12.2013, 06:51   #27
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Прочитайте про SysAllocString() и VariantChangeType()
waleri вне форума Ответить с цитированием
Старый 16.12.2013, 11:29   #28
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Прочитайте про SysAllocString() и VariantChangeType()
Спасибо за информацию, но назрел ещё один вопрос - в моём примере функции работы с WMI всегда берёт поле bstrVal структуры VARIANT. Получше просмотрев содержимое структуры, я обнаружил что она имеет целую кучу типов данных - если я правильно понял, то для каждого типа данных своё поле в этой структуре. Это так?
Исходя из моих примеров - типы string вполне читаются через bstrVal, а если поле другого типа, то не нужно ли обращаться к другому(соотв.) полю в структуре?
hvz- вне форума Ответить с цитированием
Старый 16.12.2013, 12:29   #29
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Да, нужно, ибо другие поля имеют другой тип - вы банально не сможете присвоить поле типа LONG в переменную типа BSTR и тд.

У вас проблема будет не как получить нужное поле из VARIANT структуры, а как вернуть значение из функции, которая заточена вернуть BSTR.
waleri вне форума Ответить с цитированием
Старый 16.12.2013, 15:55   #30
hvz-
Форумчанин
 
Регистрация: 14.11.2010
Сообщений: 138
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
У вас проблема будет не как получить нужное поле из VARIANT структуры, а как вернуть значение из функции, которая заточена вернуть BSTR.
Именно до этого я и дошёл - как посоветуете организовать функцию? У меня из идей только возвращение pEnumerate, т.е. полученных данных, а в каждой вкладке уже по своему обрабатывать. Возможно есть какие то готовые простые обёртки на WMI ? А то чувствую, что буду изобретать велосипед.
hvz- вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мониторинг системных ресурсов С++ Serjik-ahaha Общие вопросы C/C++ 1 18.10.2012 11:47
Мониторинг shtep PHP 1 06.02.2012 10:37
Мониторинг ОС Smile08 Безопасность, Шифрование 3 08.11.2010 16:00
Мониторинг удаленного компьютера NBAH1990 Общие вопросы Delphi 4 28.02.2010 08:35
Мониторинг CS bookkc Фриланс 4 09.01.2010 18:17