Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как узнать заблокирован ли компьютер

18K
29 июля 2010 года
imAlex
179 / / 29.07.2010
Всем привет!
Мне нужно узнать, заблокирован ли компьютер. То есть находится ли система в состоянии блокировка.
Один из способов такой блокировки: ctrl+alt+del -> блокировка.
Заранее спасибо.
Страницы:
18K
02 августа 2010 года
imAlex
179 / / 29.07.2010


Огромное спасибо за ответ, но к сожалению я столкнулся с проблемой.
Программа выдает ошибку: 'LockWorkStation' : undeclared identifier
Я прописал #define _WIN32_WINNT 0x0500 перед #include <windows.h>, и заработало, но к сожаления это не совсем то, что мне нужно.
данный фрагмент блокирует ПК, а мне нужно узнать, заблокирован он или нет.

5
02 августа 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: imAlex
Огромное спасибо за ответ, но к сожалению я столкнулся с проблемой.
Программа выдает ошибку: 'LockWorkStation' : undeclared identifier
Я прописал #define _WIN32_WINNT 0x0500 перед #include <windows.h>, и заработало, но к сожаления это не совсем то, что мне нужно.
данный фрагмент блокирует ПК, а мне нужно узнать, заблокирован он или нет.


Дело в том, что сессий может быть несколько (например на терминальном сервере). Для которой вы хотите узнать состояние? ;)
Напрямую получить состояние нельзя (об этом кстати написано в MSDN), зато можно подписаться на уведомления системы функцией WTSRegisterSessionNotification.

18K
02 августа 2010 года
imAlex
179 / / 29.07.2010
У меня одновременно может быть загружен только один пользователь, соответственно именно его мне и необходимо проследить.
Суть проги в следующем:
пользователь приходит на работу, логинится. Его имя прописывается в проге. Далее он работает, но как только ПК не трогают на протяжении 5 минут ПК блокируется, в проге появиться метка о том, что пользователь не работаем на ПК.
По-сути прога отслеживает количество времени проведенного за ПК.
Я програмист-самоучка. Разъясните, что означает "подписаться", и если это удовлетворяет ранее изложенному, то подскажите как?
PS: огромное спасибо за проявленный интерес к моей проблеме.
18K
02 августа 2010 года
imAlex
179 / / 29.07.2010
Я нашел вот такой фрагмент кода, но он к сожалению не работает. Все время пишет in
Код:
HWINSTA hW=OpenWindowStation("winsta0",0,GENERIC_READ);
USEROBJECTFLAGS uof;
DWORD tmp;
GetUserObjectInformation(hW,UOI_FLAGS,&uof,sizeof(uof),&tmp);
if (uof.dwFlags & WSF_VISIBLE){
printf ("in\n");    //not locked
}
else
{
printf ("out\n");    //locked, screen-saved :), or something else
}
253
02 августа 2010 года
Proger_XP
1.5K / / 07.08.2004
Цитата: imAlex
Суть проги в следующем


Для этой задачи по идее и не нужно таких сложных манёвров. Можно просто поместить прогу в автозапуск и она будет висеть в памяти, отслеживая, скажем, движения мышкой и нажатие клавишь.

Цитата: imAlex
Разъясните, что означает "подписаться"?


Это значит, что когдп произойдёт какое-то событие, то ОС уведомит подписавшуюся прогу о нём, например, через сообщения обработчику окна (WM_*), для событий в трее используется; либо через callback-функцию, как для мультимедийных таймеров.

Подробности надо узнавать в доках по каждой функции, выше уже дали ссылку.

18K
02 августа 2010 года
imAlex
179 / / 29.07.2010
Цитата: Proger_XP
Для этой задачи по идее и не нужно таких сложных манёвров. Можно просто поместить прогу в автозапуск и она будет висеть в памяти, отслеживая, скажем, движения мышкой и нажатие клавишь.


А этот способ не будет сильно грузить ПК?
Машинки у нас не сильные. Я так понимаю, что для того, чтоб отслеживать клаву и мышь, необходимо написать "глобальный хук", который будет отслеживать и то и другое ежесекундно.

253
02 августа 2010 года
Proger_XP
1.5K / / 07.08.2004
Цитата: imAlex
А этот способ не будет сильно грузить ПК?
Машинки у нас не сильные. Я так понимаю, что для того, чтоб отслеживать клаву и мышь, необходимо написать "глобальный хук", который будет отслеживать и то и другое ежесекундно.


Да, хук будет нужен, но я не думаю, что будет высокая загрузка ЦП - тебе нужно менять 1-2 переменных в обработчике, и всё.

Для мышки можно даже более лёгкий метод сделать - каждую минуту, к примеру, проверять её положение через GetCursorPos(), тут вообще никакой загрузки. Клаву тогда можно и не хукать, вряд ли юзеры долго работают без мышки.

18K
02 августа 2010 года
imAlex
179 / / 29.07.2010
Цитата: Proger_XP
Да, хук будет нужен, но я не думаю, что будет высокая загрузка ЦП - тебе нужно менять 1-2 переменных в обработчике, и всё.



Огромное спасибо за проявленный интерес.
Боюсь я с этим не справлюсь. Может есть где исходники?
По ссылке нашел WTS_SESSION_LOCK, а как ей воспользоваться. То есть как на нее подписаться?

253
02 августа 2010 года
Proger_XP
1.5K / / 07.08.2004
Попробуй второй вариант с проверкой положения мышки, он самый простой и невелосипедный.
7
02 августа 2010 года
@pixo $oft
3.4K / / 20.09.2006
Ищите в MSND(если владеете английским).А ещё можно поступить проще–в настройках рабочего стола на вкладке «Заставка» поставить «Начинать с экрана приветствия»(или в этом роде).Т.е. при этом компьютер будет блокироваться и можно будет отловить
Или ещё проще–поставить в заставку свою программу,которая будет запускаться,если пройдёт >5 минут и делать метку
7
02 августа 2010 года
@pixo $oft
3.4K / / 20.09.2006
Вот и вот нашёл.1е–функция для подписки,2е–получаемое сообщение.Удачи!
18K
15 сентября 2010 года
imAlex
179 / / 29.07.2010
а в какой переменной хранится само сообщение. т.е.
BOOL WTSRegisterSessionNotification(
__in HWND hWnd,
__in DWORD dwFlags
);
вызывает получение сообщения, а принять его как?
7
15 сентября 2010 года
@pixo $oft
3.4K / / 20.09.2006
Через оконную процедуру,очевидно же.В неё придёт какое-то сообщение(код сообщения вычитывайте там),вот и узнаете
18K
17 сентября 2010 года
imAlex
179 / / 29.07.2010
Огромное спасибо за ссылки. Они указали мне направление.
Я вот уже три дня пытаюсь разобраться с декорацией :confused:...ничего не выходит. Может есть у кого пример декларации? Мне надо в переменную получать сообщение от оси о блокировке и разблокирование системы. Я пишу в Visual C++ 6
Буду очень признателен за любую помощь.
18K
21 сентября 2010 года
imAlex
179 / / 29.07.2010
Еще раз всем, добрый день.
Изучив материал предоставленный @pixo $oft, я нашол статью http://support.microsoft.com/kb/310153#top.
К сожалению у меня выдает ошибку:
Цитата:
fastuserswitching\fastuserswitching.cpp(4) : fatal error C1083: Cannot open precompiled header file: 'Debug/FastUserSwitching.pch': No such file or directory
Error executing cl.exe.

Всю инструкцию я проделал в новом проекте.
Работаю в Visual 6.
Помогите разобраться. Если для разбора необходим сам проект, я могу его предоставить.
Заранее спасибо.

7
22 сентября 2010 года
@pixo $oft
3.4K / / 20.09.2006
У вас что-то с precompiled headers.Надо смотреть в настройках проекта(сам с ними дела почти не имел,поэтому посоветовать особо не могу)
Посмотрите,может,этот файл в другой папке.Или в опциях проекта настройте
18K
23 сентября 2010 года
imAlex
179 / / 29.07.2010
Я с Precompiled header разобрался. В настройках проекта отключил их. У меня возникла другая проблема, с подключением wtsapi32.h. У вас случаем не найдется пару минут проделать инструкцию и скинуть мне исходники проекта? Понимаю что просьба звучит хамски, но к сожалению мне никак не справиться с этим. http://support.microsoft.com/kb/310153#appliesto
18K
24 сентября 2010 года
imAlex
179 / / 29.07.2010
Чето не получается.
Мне посаветовали подключить lib и Include из C:\Program Files\Microsoft SDKs\Windows\v7.0A,
выдает ошибку
Цитата:
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/FastUserSwitching.exe : fatal error LNK1120: 1 unresolved externals

14
24 сентября 2010 года
Phodopus
3.3K / / 19.06.2008
LIBC слишком старая для MSVC библиотека, откуда вы ее вытащили?
297
25 сентября 2010 года
koodeer
1.2K / / 02.05.2009
Цитата: imAlex
Я с Precompiled header разобрался. В настройках проекта отключил их. У меня возникла другая проблема, с подключением wtsapi32.h. У вас случаем не найдется пару минут проделать инструкцию и скинуть мне исходники проекта? Понимаю что просьба звучит хамски, но к сожалению мне никак не справиться с этим. http://support.microsoft.com/kb/310153#appliesto



Я попробовал повторить пример. Использую Visual Studio 2005. Всё работает без проблем. Но вам исходники проекта не помогут, т. к. всё равно у вас на компе нет wtsapi32.h.
Присоединюсь к совету, данному вам на другом форуме: сменить IDE и скачать SDK от мелкомягких.

18K
25 сентября 2010 года
imAlex
179 / / 29.07.2010
Цитата: koodeer
Я попробовал повторить пример. Использую Visual Studio 2005. Всё работает без проблем. Но вам исходники проекта не помогут, т. к. всё равно у вас на компе нет wtsapi32.h.
Присоединюсь к совету, данному вам на другом форуме: сменить IDE и скачать SDK от мелкомягких.


Я поставил VC 10 и настроил все. Все библиотеки теперь есть и подключены. Скинь плиз свой код, у меня все равно выдает ошибку _main.
Я в курсе, что необходимо создать маин, но вот только не в курсе, как туда направить сообщение о блокировке системы

18K
27 сентября 2010 года
imAlex
179 / / 29.07.2010
Что означают следующие ошибки:
Цитата:
"FastUserSwitching.exe": Загружено: "D:\InOut\FastUserSwitching2\FastUserSwitching\Debug\FastUserSwitching.exe", Символы загружены.
"FastUserSwitching.exe": Загружено: "C:\WINDOWS\system32\ntdll.dll", Невозможно найти или открыть файл PDB
"FastUserSwitching.exe": Загружено: "C:\WINDOWS\system32\kernel32.dll", Невозможно найти или открыть файл PDB
"FastUserSwitching.exe": Загружено: "C:\WINDOWS\system32\user32.dll", Невозможно найти или открыть файл PDB
"FastUserSwitching.exe": Загружено: "C:\WINDOWS\system32\gdi32.dll", Невозможно найти или открыть файл PDB
"FastUserSwitching.exe": Загружено: "C:\WINDOWS\system32\wtsapi32.dll", Невозможно найти или открыть файл PDB
"FastUserSwitching.exe": Загружено: "C:\WINDOWS\system32\msvcrt.dll", Невозможно найти или открыть файл PDB
"FastUserSwitching.exe": Загружено: "C:\WINDOWS\system32\winsta.dll", Невозможно найти или открыть файл PDB
"FastUserSwitching.exe": Загружено: "C:\WINDOWS\system32\netapi32.dll", Невозможно найти или открыть файл PDB
"FastUserSwitching.exe": Загружено: "C:\WINDOWS\system32\advapi32.dll", Невозможно найти или открыть файл PDB
"FastUserSwitching.exe": Загружено: "C:\WINDOWS\system32\rpcrt4.dll", Невозможно найти или открыть файл PDB
"FastUserSwitching.exe": Загружено: "C:\WINDOWS\system32\secur32.dll", Невозможно найти или открыть файл PDB
"FastUserSwitching.exe": Загружено: "C:\WINDOWS\system32\msvcr100d.dll", Символы загружены.
"FastUserSwitching.exe": Загружено: "C:\WINDOWS\system32\guard32.dll", Невозможно найти или открыть файл PDB
"FastUserSwitching.exe": Загружено: "C:\WINDOWS\system32\version.dll", Невозможно найти или открыть файл PDB
"FastUserSwitching.exe": Загружено: "C:\WINDOWS\system32\fltlib.dll", Невозможно найти или открыть файл PDB

7
27 сентября 2010 года
@pixo $oft
3.4K / / 20.09.2006
Ды это и не ошибки,в общем-то,а предупреждения,что в случае отладки ядрёных функций вы будете работать без символов.Надо скачать символы для отладчика(сам качал когда-то,но уже не помню,откуда)

Это некритично
18K
27 сентября 2010 года
imAlex
179 / / 29.07.2010
Я тут завис окончательно.. Никак не могу понять, как проверить что лежит в WM_WTSSESSION_CHANG, и как заставить прогу не закрываться. Есть конечно вариант в стиле пустить счетчик, но на мой взгляд это плохая идея (зря проц грузит).
297
28 сентября 2010 года
koodeer
1.2K / / 02.05.2009
imAlex, давайте по пунктам.
Создайте новый проект Win32 Project. Все настройки по умолчанию. Компилируем. Компилируется? Запускаем. Запускается? Едем дальше.
Выполняем пункты с сайта мелкомягких.
1. Открываем файл stdafx.h и добавляем туда указанную строку кода. Компилируем. Запускаем. Работает?
2. Добавляем в файл cpp другие две строки кода. Компилируем. Запускаем.
...
И так далее, по пунктам. На каком пункте перестанет работать - пишите сюда. С обязательным указанием пункта. И ошибки приведите. Не вставляйте сразу весь код в свой проект. Тогда, возможно, вам помогут советом.

А так невозможно сказать, в чём у вас проблема, не зная, после чего возникли те перечисленные выше ошибки.

Цитата: imAlex
Никак не могу понять, как проверить что лежит в WM_WTSSESSION_CHANG


Эмм... В статье же приведён пример кода со switch'ем (пункт 5). Так и проверяется, что пришло по сообщению WM_WTSSESSION_CHANGE.
Если нужен полный перечень констант, которые могут оказаться в wParam - клик правой кнопкой мыши по любой из констант (например, WTS_CONSOLE_CONNECT) и клик в контекстном меню Go To Definition.

Цитата: imAlex
и как заставить прогу не закрываться


В смысле?

18K
30 сентября 2010 года
imAlex
179 / / 29.07.2010
koodeer, спасибо за свет. Попробуем так
18K
30 сентября 2010 года
imAlex
179 / / 29.07.2010
Сразу возникает первый вопрос. В VS 10 express не создать "Hello World" application.
18K
30 сентября 2010 года
imAlex
179 / / 29.07.2010
Цитата: koodeer

Эмм... В статье же приведён пример кода со switch'ем (пункт 5). Так и проверяется, что пришло по сообщению WM_WTSSESSION_CHANGE.
Если нужен полный перечень констант, которые могут оказаться в wParam - клик правой кнопкой мыши по любой из констант (например, WTS_CONSOLE_CONNECT) и клик в контекстном меню Go To Definition.


То что приведено в статье, мне достаточно, но вот я не совсем понимаю как это работает. Насколько я понял, написанное приложение (впрочем как и все остальные приложения на ПК) получает сообщение от системы о ее состоянии. Например: если юзер логинится, то система отправляет всем запущенным приложениям сообщение-логин. Моя программа принимает его в процедуру WndProc. Там система переключения в кейсе (WM_WTSSESSION_CHANGE) переключается (switch( wParam )) на необходимое состояние (например WTS_CONSOLE_CONNECT), которое в свою очередь определено под каждое получаемое сообщение. Получается, что в объявленном

 
Код:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
в
 
Код:
case WM_WTSSESSION_CHANGE
параметр
 
Код:
wParam
находится в состоянии
 
Код:
case WTS_CONSOLE_CONNECT
. Если все действительно так, то как мне из маина проверять это состояние. Мне необходимо, чтоб в момент переключения в файл записывалась та или иная информация. Если я что-то не правильно понимаю, разъясните пожалуйста. Быть может мне и незачем отслеживать это в маине, но тогда как это сделать.
По поводу закрытия окна: на данном этапе мое приложение открывается на доли секунд и сразу закрывается, а по идее должна работать постоянно, иначе как она узнает о изменении системы и отреагирует на него должным образом.
350
01 октября 2010 года
cheburator
589 / / 01.06.2006
Во-первых, вопрос: обязательно ли связывать поведение программы с блокировкой системы.
Во-вторых, обязательно ли связывать поведение программы с движениями мыши.
Обычно программе по барабану, заблокирован комп или нет, и по барабану до движений мыши - важны действия мышью и клавиатурой; для этого достаточно просто ловить сообщения WM_LBUTTONDOWN, WM_LBUTTONUP, WM_RBUTTONDOWN, WM_RBUTTONUP (в качестве примера) и соотв. сообщения клавиатуры и сообщение WM_TIMER.
Например, я завожу переменную TimeNotUsed (число секунд, в течение которых не было активных действий), при получении сообщения WM_TIMER увеличиваю переменную на 1, при получении "активных" сообщений сбрасываю переменную в 0.
Если при очередном сообщении WM_TIMER я вижу, что накопилось 5 минут, я сворачиваю программу или что там ещё нужно.
18K
01 октября 2010 года
imAlex
179 / / 29.07.2010
cheburator, мне безразличны действия производимые мышью и клавой. Мне необходимо узнать, заблокирован ли ПК. В итоге прога должна вычислять со скольки и до скольки был включен ПК, под каким пользователем, периоды, когда пользователь не работал за ПК, а комп при этом был включен.
Прокомментируйте мое пред идущее сообщение.
297
01 октября 2010 года
koodeer
1.2K / / 02.05.2009
Цитата: imAlex
Сразу возникает первый вопрос. В VS 10 express не создать "Hello World" application.


Не нужно никакого "Hello world".

как мне из маина проверять это состояние. Мне необходимо, чтоб в момент переключения в файл записывалась та или иная информация.
Быть может мне и незачем отслеживать это в маине, но тогда как это сделать.


Не нужен вам main. В таких OS как Windows, вся работа основана на событиях. По событию блокирования в приложение придёт сообщение. Обрабатываем это сообщение и выполняем нужные действия.

 
Код:
case WTS_SESSION_LOCK:
    MessageBox(hWnd, TEXT("WTS_SESSION_LOCK"),
        TEXT("WM_WTSSESSION_CHANGE"), MB_OK );
    break;
case WTS_SESSION_UNLOCK:
    MessageBox(hWnd, TEXT("WTS_SESSION_UNLOCK"),
        TEXT("WM_WTSSESSION_CHANGE"), MB_OK );
    break;

В этом месте вместо показа МесседжБоксов пишите в файл нужные сообщения. Что-то вроде:
 
Код:
case WTS_SESSION_LOCK:
    WriteToLog("Юзер бездельничает");
    break;
case WTS_SESSION_UNLOCK:
    WriteToLog("Юзер начал работу");
    break;



Цитата: imAlex
По поводу закрытия окна: на данном этапе мое приложение открывается на доли секунд и сразу закрывается


С какой стати оно закрывается? Вы какого типа приложение создали?

18K
05 октября 2010 года
imAlex
179 / / 29.07.2010
Цитата: koodeer
Не нужно никакого "Hello world".
Не нужно никакого "Hello world".
Цитата:
Сообщение от Поддержка Майкрософт
Users of Visual Studio .NET or later versions: select Win32 Project within Visual C++ Projects and accept the default application settings displayed by the Application Setup Wizard.


Я делал следующим образом:Файл, создать проект, консольное приложение win32.
Но дело все в том, что при данном методе в созданных файлах нет записей о которых говорят на сайте MS.

18K
05 октября 2010 года
imAlex
179 / / 29.07.2010
я понял свою ошибку, щас пробую исправить
18K
05 октября 2010 года
imAlex
179 / / 29.07.2010
При добавлении строки
Цитата:
WTSRegisterSessionNotification(hWnd, NOTIFY_FOR_THIS_SESSION);

на 4-ом шаге, выдает ошибки:

Цитата:
1>------ Построение начато: проект: test2, Конфигурация: Debug Win32 ------
1> test2.cpp
1>d:\test\test2\test2\test2.cpp(3): warning C4067: непредвиденные лексемы за директивой препроцессора, требуется newline
1>d:\test\test2\test2\test2.cpp(3): warning C4627: #include <wtsapi32.h>: пропущен при поиске использования предкомпилированного заголовка
1> Добавление директивы в "StdAfx.h" или перестройка предкомпилированного заголовка
1>d:\test\test2\test2\test2.cpp(123): error C2065: NOTIFY_FOR_THIS_SESSION: необъявленный идентификатор
1>d:\test\test2\test2\test2.cpp(123): error C3861: WTSRegisterSessionNotification: идентификатор не найден
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

18K
05 октября 2010 года
imAlex
179 / / 29.07.2010
Возможно это в виду того, что я не добавлял Wtsapi32.lib в проект.
Не знаю есть ли в этом необходимость, т.к. в папке "внешние зависимости" эта библиотека уже имеется
18K
05 октября 2010 года
imAlex
179 / / 29.07.2010
Попробовал в свойствах проекта выбрать в поле "предварительно откомпилированные заголовки" выбрать пункт "Создать (/Yc)", в результате получил сл. ошибки:
Цитата:
1>d:\test\test2\test2\test2.cpp(123): error C2065: NOTIFY_FOR_THIS_SESSION: необъявленный идентификатор
1>d:\test\test2\test2\test2.cpp(123): error C3861: WTSRegisterSessionNotification: идентификатор не найден
1>d:\test\test2\test2\test2.cpp(168): error C3861: WTSUnRegisterSessionNotification: идентификатор не найден
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

7
05 октября 2010 года
@pixo $oft
3.4K / / 20.09.2006
Задам глупый вопрос:а заголовочный(.h) файл вы подключили?Выглядит так,что нет
Или что-то у вас с предкомпилированными заголовками.Это какая-то странная тема,не знаю,зачем они и как с ними работать(но будет интересно,если просветят:))
1
05 октября 2010 года
kot_
7.3K / / 20.01.2000
Так как тема начинает превращаться в санта-барбару - тема закрыта. После ознакомления с основами программирования просьбе ТС можем открыть ее снова
1
08 октября 2010 года
kot_
7.3K / / 20.01.2000
По просьбе автора тема открыта. Прошу обратить внимание - сама по себе тема интересна - но если опять будет скатываться в обсуждение "подключил ли ТС заголовочный файл".... думаю понятно. Если вы беретесь за системное программирование - не стесняйтесь ознакомится для начала с основами языка.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог