Russian Qt Forum
Ноябрь 25, 2024, 01:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Блокировка экрана  (Прочитано 17926 раз)
virtual_root
Гость
« : Июль 05, 2012, 16:11 »

Добрый день ребята снова) Подскажите, пожалуйста есть ли в Qt какая-нибудь функция для проверки заблокирован ли экран системы? В winAPI есть фун-я LockWorkStation она блокирует экран, а в Qt есть аналоги платформонезависимые и чтоб проверить можно было, заблокирован ли экран.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Июль 05, 2012, 16:47 »

Нет.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
virtual_root
Гость
« Ответ #2 : Июль 05, 2012, 17:01 »

Пантер, а вы не подскажите как с помощью winAPI проверить заблокирован ли экран?
Записан
DmitryM
Гость
« Ответ #3 : Июль 05, 2012, 17:11 »

Пантер, а вы не подскажите как с помощью winAPI проверить заблокирован ли экран?
How to Lock the Workstation
Записан
virtual_root
Гость
« Ответ #4 : Июль 05, 2012, 17:26 »

почему-то я не могу воспользоваться этой фун-ей LockWorkStation()... какой заголовочный файл ей нужен?
Записан
DmitryM
Гость
« Ответ #5 : Июль 05, 2012, 17:43 »

почему-то я не могу воспользоваться этой фун-ей LockWorkStation()... какой заголовочный файл ей нужен?
Гугл забанил?
Код
C++ (Qt)
#define _WIN32_WINNT 0x0500
#define WINVER 0x0500
 
#include <windows.h>
 
#include <cstdio>
 
#pragma comment( lib, "user32.lib" )
 
int main()
{
   // Lock the workstation.
 
   if( !LockWorkStation() )
       printf ("LockWorkStation failed with %d\n", GetLastError());
   return 0;
}
 
Записан
virtual_root
Гость
« Ответ #6 : Июль 05, 2012, 17:44 »

да-да уже разобралась, спасибо. Но дело в том что эта фун-я не возвращает никакого значения как вы ей так воспользовались?
Записан
virtual_root
Гость
« Ответ #7 : Июль 05, 2012, 17:56 »

нашла фун-ю с помощью которой можно отслеживать, инф-ю о том что пользователь заблокировал экран, разлогинился. Эта фун-я WTSRegisterSessionNotification. Но у меня никак не получается её использовать.. Вот код:
Код:
QLibrary myLib("./user32");

        myLib.load();
        myLib.loadHints();

        if (!myLib.isLoaded())
            exit(0);

        typedef void (*MyPrototype)();
        MyPrototype myFunction = (MyPrototype) myLib.resolve("LockWorkStation"); // фун-я блокировки экрана

        typedef bool (*MyPrototype2)(HWND,DWORD);
        MyPrototype2 WTSRegisterSessionNotification = (MyPrototype2) myLib.resolve("WTSRegisterSessionNotification");

        if (!WTSRegisterSessionNotification(GetDesktopWindow(),NOTIFY_FOR_THIS_SESSION)) qDebug()<<"no";
        else qDebug()<<"yes";
Подскажите кто работал с этой фун-ей, пожалуйста! Как мне с её помощью отлавливать состояние сессии? Может на неё можно хук поставить, стобы получать событие о том что пользователь заблокировал экран?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #8 : Июль 05, 2012, 18:00 »

вы можете по порядку, строчку за строчкой, объяснить этот код, и почему он написан именно так?
Записан
virtual_root
Гость
« Ответ #9 : Июль 05, 2012, 18:13 »

в этом коде я импортируюю dll теперь переделала на wtsapi32 - эту dll подключаю. Оборачиваю фун-ю из неё в прототип потом вызываю её. Изменила на WTSRegisterSessionNotification(GetDesktopWindow(),0)) и всё заработало. GetDesktopWindow() - api фун-я возвращает дескриптор рабочего стола. Но что-то блокировку экрана так и не ловит.. я в таймере эту фун-ю WTSRegisterSessionNotification(GetDesktopWindow(),0)) вызываю. Может у кого есть идеи как отловить блокировку экрана?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #10 : Июль 05, 2012, 18:23 »

танцы с resolve() нужны только если не знаешь поддерживает ли целевая система эти функции. а если уж пользоваться resolve(), то по-хорошему надо проверять полученный указатель на 0.

а как ловить событие – ну надо документацию читать:
Цитировать
Session change notifications are sent in the form of a WM_WTSSESSION_CHANGE message. These notifications are sent only to the windows that have registered for them using this function.

When a window no longer requires these notifications, it must call WTSUnRegisterSessionNotification before being destroyed. For every call to this function, there must be a corresponding call to WTSUnRegisterSessionNotification.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #11 : Июль 05, 2012, 18:25 »

В документации написано, что WTSRegisterSessionNotification регистрирует нотификацию, а не возвращает сразу статус блокировки. Возвращает она статус операции по установке нотификатора. Нотификация отправляется в указанное в WTSRegisterSessionNotification окно, зачем вы передаёте туда desktop?
Записан
Serr500
Гость
« Ответ #12 : Июль 05, 2012, 20:27 »

virtual_root, Вы невнимательно читали документацию. Функция WTSRegisterSessionNotification регистрирует окно, которое будет получать сообщение WM_WTSSESSION_CHANGE. Передаёте в неё дескриптор окна и в его оконной процедуре ловите WM_WTSSESSION_CHANGE. В словленном сообщении смотрите на wParam. Если он WTS_SESSION_LOCK, то юзер заблокировал сессию, если WTS_SESSION_UNLOCK - разблокировал. Так же можно ловить logon и logout. http://msdn.microsoft.com/en-us/library/windows/desktop/aa383828%28v=vs.85%29.aspx
Записан
virtual_root
Гость
« Ответ #13 : Июль 06, 2012, 09:56 »

Ребята спасибо, я поняла. Только никак не могу понять как мне тогда ловить сообщения от фун-и WTSRegisterSessionNotification ? Надо же как-то подписаться на них что ли? Я так понимаю, что мне в неё нужно передать дескриптор своего приложения и мне потом будут приходить сообщения, а каким образом мне на них обработчик поставить, ну что-то вроде связать приход сообщения с функ-ей
Код:
LRESULT CALLBACK WindowProc(
  HWND hWnd,       // handle to window
  UINT Msg,        // WM_WTSSESSION_CHANGE
  WPARAM wParam,   // session state change event
  LPARAM lParam    // session ID
);

Я же должна где - то указать что именно ей отправлять сообщение на обработку? И как можно получить дескриптор моего окна, если я планирую приложение сделать без интерфейсным, как службу. Как мне сказать что имено в неё должны приходить сообщения от фун-и WTSRegisterSessionNotification ?
Только не сердитесь, пожалуйста, подскажите мне, чтоб до ума довести))
« Последнее редактирование: Июль 06, 2012, 10:29 от virtual_root » Записан
Serr500
Гость
« Ответ #14 : Июль 06, 2012, 10:39 »

Ещё раз. WTSRegisterSessionNotification не выдаёт никаких сообщений. Дескриптор нужен не приложения, а окна. Я рекомендую создать функциями WinAPI невидимое окно, подписать его на WM_WTSSESSION_CHANGE и подменить его оконную процедуру. Если это сложно, то можно подписать на сообщение существующее окно. Дескриптор окна можно получить методом QWidget::winId, его и передаём в WTSRegisterSessionNotification. Затем перехватываем оконные сообщения, переопределив у виджета виртуальный метод QWidget::winEvent. В его первом параметре MSG *message проверяем Msg и wParam. Если они те, что нам нужны, генерируем сигнал или делаем что-то другое. Не забудьте в конце вызвать winEvent родителя.
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.153 секунд. Запросов: 23.