Как узнать заблокирован ли компьютер
Мне нужно узнать, заблокирован ли компьютер. То есть находится ли система в состоянии блокировка.
Один из способов такой блокировки: ctrl+alt+del -> блокировка.
Заранее спасибо.
Огромное спасибо за ответ, но к сожалению я столкнулся с проблемой.
Программа выдает ошибку: 'LockWorkStation' : undeclared identifier
Я прописал #define _WIN32_WINNT 0x0500 перед #include <windows.h>, и заработало, но к сожаления это не совсем то, что мне нужно.
данный фрагмент блокирует ПК, а мне нужно узнать, заблокирован он или нет.
Программа выдает ошибку: 'LockWorkStation' : undeclared identifier
Я прописал #define _WIN32_WINNT 0x0500 перед #include <windows.h>, и заработало, но к сожаления это не совсем то, что мне нужно.
данный фрагмент блокирует ПК, а мне нужно узнать, заблокирован он или нет.
Дело в том, что сессий может быть несколько (например на терминальном сервере). Для которой вы хотите узнать состояние? ;)
Напрямую получить состояние нельзя (об этом кстати написано в MSDN), зато можно подписаться на уведомления системы функцией WTSRegisterSessionNotification.
Суть проги в следующем:
пользователь приходит на работу, логинится. Его имя прописывается в проге. Далее он работает, но как только ПК не трогают на протяжении 5 минут ПК блокируется, в проге появиться метка о том, что пользователь не работаем на ПК.
По-сути прога отслеживает количество времени проведенного за ПК.
Я програмист-самоучка. Разъясните, что означает "подписаться", и если это удовлетворяет ранее изложенному, то подскажите как?
PS: огромное спасибо за проявленный интерес к моей проблеме.
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
}
Для этой задачи по идее и не нужно таких сложных манёвров. Можно просто поместить прогу в автозапуск и она будет висеть в памяти, отслеживая, скажем, движения мышкой и нажатие клавишь.
Это значит, что когдп произойдёт какое-то событие, то ОС уведомит подписавшуюся прогу о нём, например, через сообщения обработчику окна (WM_*), для событий в трее используется; либо через callback-функцию, как для мультимедийных таймеров.
Подробности надо узнавать в доках по каждой функции, выше уже дали ссылку.
А этот способ не будет сильно грузить ПК?
Машинки у нас не сильные. Я так понимаю, что для того, чтоб отслеживать клаву и мышь, необходимо написать "глобальный хук", который будет отслеживать и то и другое ежесекундно.
Машинки у нас не сильные. Я так понимаю, что для того, чтоб отслеживать клаву и мышь, необходимо написать "глобальный хук", который будет отслеживать и то и другое ежесекундно.
Да, хук будет нужен, но я не думаю, что будет высокая загрузка ЦП - тебе нужно менять 1-2 переменных в обработчике, и всё.
Для мышки можно даже более лёгкий метод сделать - каждую минуту, к примеру, проверять её положение через GetCursorPos(), тут вообще никакой загрузки. Клаву тогда можно и не хукать, вряд ли юзеры долго работают без мышки.
Огромное спасибо за проявленный интерес.
Боюсь я с этим не справлюсь. Может есть где исходники?
По ссылке нашел WTS_SESSION_LOCK, а как ей воспользоваться. То есть как на нее подписаться?
Или ещё проще–поставить в заставку свою программу,которая будет запускаться,если пройдёт >5 минут и делать метку
BOOL WTSRegisterSessionNotification(
__in HWND hWnd,
__in DWORD dwFlags
);
вызывает получение сообщения, а принять его как?
Я вот уже три дня пытаюсь разобраться с декорацией :confused:...ничего не выходит. Может есть у кого пример декларации? Мне надо в переменную получать сообщение от оси о блокировке и разблокирование системы. Я пишу в Visual C++ 6
Буду очень признателен за любую помощь.
Изучив материал предоставленный @pixo $oft, я нашол статью http://support.microsoft.com/kb/310153#top.
К сожалению у меня выдает ошибку:
Error executing cl.exe.
Всю инструкцию я проделал в новом проекте.
Работаю в Visual 6.
Помогите разобраться. Если для разбора необходим сам проект, я могу его предоставить.
Заранее спасибо.
Посмотрите,может,этот файл в другой папке.Или в опциях проекта настройте
Мне посаветовали подключить lib и Include из C:\Program Files\Microsoft SDKs\Windows\v7.0A,
выдает ошибку
Debug/FastUserSwitching.exe : fatal error LNK1120: 1 unresolved externals
Я попробовал повторить пример. Использую Visual Studio 2005. Всё работает без проблем. Но вам исходники проекта не помогут, т. к. всё равно у вас на компе нет wtsapi32.h.
Присоединюсь к совету, данному вам на другом форуме: сменить IDE и скачать SDK от мелкомягких.
Присоединюсь к совету, данному вам на другом форуме: сменить IDE и скачать SDK от мелкомягких.
Я поставил VC 10 и настроил все. Все библиотеки теперь есть и подключены. Скинь плиз свой код, у меня все равно выдает ошибку _main.
Я в курсе, что необходимо создать маин, но вот только не в курсе, как туда направить сообщение о блокировке системы
"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
Это некритично
Создайте новый проект Win32 Project. Все настройки по умолчанию. Компилируем. Компилируется? Запускаем. Запускается? Едем дальше.
Выполняем пункты с сайта мелкомягких.
1. Открываем файл stdafx.h и добавляем туда указанную строку кода. Компилируем. Запускаем. Работает?
2. Добавляем в файл cpp другие две строки кода. Компилируем. Запускаем.
...
И так далее, по пунктам. На каком пункте перестанет работать - пишите сюда. С обязательным указанием пункта. И ошибки приведите. Не вставляйте сразу весь код в свой проект. Тогда, возможно, вам помогут советом.
А так невозможно сказать, в чём у вас проблема, не зная, после чего возникли те перечисленные выше ошибки.
Эмм... В статье же приведён пример кода со switch'ем (пункт 5). Так и проверяется, что пришло по сообщению WM_WTSSESSION_CHANGE.
Если нужен полный перечень констант, которые могут оказаться в wParam - клик правой кнопкой мыши по любой из констант (например, WTS_CONSOLE_CONNECT) и клик в контекстном меню Go To Definition.
В смысле?
Эмм... В статье же приведён пример кода со switch'ем (пункт 5). Так и проверяется, что пришло по сообщению WM_WTSSESSION_CHANGE.
Если нужен полный перечень констант, которые могут оказаться в wParam - клик правой кнопкой мыши по любой из констант (например, WTS_CONSOLE_CONNECT) и клик в контекстном меню Go To Definition.
То что приведено в статье, мне достаточно, но вот я не совсем понимаю как это работает. Насколько я понял, написанное приложение (впрочем как и все остальные приложения на ПК) получает сообщение от системы о ее состоянии. Например: если юзер логинится, то система отправляет всем запущенным приложениям сообщение-логин. Моя программа принимает его в процедуру WndProc. Там система переключения в кейсе (WM_WTSSESSION_CHANGE) переключается (switch( wParam )) на необходимое состояние (например WTS_CONSOLE_CONNECT), которое в свою очередь определено под каждое получаемое сообщение. Получается, что в объявленном
По поводу закрытия окна: на данном этапе мое приложение открывается на доли секунд и сразу закрывается, а по идее должна работать постоянно, иначе как она узнает о изменении системы и отреагирует на него должным образом.
Во-вторых, обязательно ли связывать поведение программы с движениями мыши.
Обычно программе по барабану, заблокирован комп или нет, и по барабану до движений мыши - важны действия мышью и клавиатурой; для этого достаточно просто ловить сообщения WM_LBUTTONDOWN, WM_LBUTTONUP, WM_RBUTTONDOWN, WM_RBUTTONUP (в качестве примера) и соотв. сообщения клавиатуры и сообщение WM_TIMER.
Например, я завожу переменную TimeNotUsed (число секунд, в течение которых не было активных действий), при получении сообщения WM_TIMER увеличиваю переменную на 1, при получении "активных" сообщений сбрасываю переменную в 0.
Если при очередном сообщении WM_TIMER я вижу, что накопилось 5 минут, я сворачиваю программу или что там ещё нужно.
Прокомментируйте мое пред идущее сообщение.
Не нужно никакого "Hello world".
Быть может мне и незачем отслеживать это в маине, но тогда как это сделать.
Не нужен вам main. В таких OS как Windows, вся работа основана на событиях. По событию блокирования в приложение придёт сообщение. Обрабатываем это сообщение и выполняем нужные действия.
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;
В этом месте вместо показа МесседжБоксов пишите в файл нужные сообщения. Что-то вроде:
WriteToLog("Юзер бездельничает");
break;
case WTS_SESSION_UNLOCK:
WriteToLog("Юзер начал работу");
break;
С какой стати оно закрывается? Вы какого типа приложение создали?
Не нужно никакого "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.
на 4-ом шаге, выдает ошибки:
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 ==========
Не знаю есть ли в этом необходимость, т.к. в папке "внешние зависимости" эта библиотека уже имеется
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 ==========
Или что-то у вас с предкомпилированными заголовками.Это какая-то странная тема,не знаю,зачем они и как с ними работать(но будет интересно,если просветят:))