Форум программистов  
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

Цитата:
Сообщение от 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
Адрес: Нижний Новгород
Сообщений: 5,079
Репутация: 1532
По умолчанию

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

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

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

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

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

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

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

Кое как разобрался с 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
Адрес: Нижний Новгород
Сообщений: 5,079
Репутация: 1532
По умолчанию

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

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

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

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

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



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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




03:13.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru