C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: получение WTS_SESSION_UNLOCK  (Прочитано 2809 раз)
morge
Участник


Сказали спасибо: +2/-0
Offline

Сообщений: 31


получение WTS_SESSION_UNLOCK
« : 19 Январь 2010, 15:57:15 »

Возможно, по теме ближе всего к WinAPI.
Надо получить событие WTS_SESSION_UNLOCK под win xp.
Нашёл примеры для Делфи и VC (кажется) а вот перевести это и получать события под builder не получилось.

Что делаю, подключаю:
#include
#include
#pragma comment(lib,"WtsApi32.lib")

в

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 WTSRegisterSessionNotification(Application->Handle,NOTIFY_FOR_ALL_SESSIONS);
}

в unit1.h добавлено void __fastcall WndProc(Messages::TMessage& Message);

в unit1.cpp жду события в функции:

void __fastcall TForm1::WndProc(Messages::TMessage& Message)
{ 
 if (Message.Msg==WM_WTSSESSION_CHANGE)  // тут ошибка при компиляции: E2451 Undefined symbol 'WM_WTSSESSION_CHANGE'
 {
  switch (Message.WParam)
  {

   case 8:  // WTS_SESSION_UNLOCK==8  // или можно заменить 8 на WTS_SESSION_UNLOCK // тогда нарисует что это - неизвестно
   ShowMessage("WTS_SESSION_UNLOCK");
   break;

   default:;
   //unknown
  }
 }
 TForm::WndProc(Message);
}


У меня такое чувство, что в __fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)  чего-то не хватает, помогите кто знает.
« Последнее редактирование: 19 Январь 2010, 16:07:29 от morge » Записан
Exhale
Нужно делать так как нужно, а так как не нужно делать не нужно
Участник


Сказали спасибо: +36/-9
Offline

Сообщений: 247

TDD, XP


Re: получение WTS_SESSION_UNLOCK
« Ответ #1 : 20 Январь 2010, 08:39:14 »

Цитата: morge от 19 Январь 2010, 15:57:15
if (Message.Msg==WM_WTSSESSION_CHANGE)  // тут ошибка при компиляции: E2451 Undefined symbol 'WM_WTSSESSION_CHANGE'
Объявите его как
Код
#define WM_WTSSESSION_CHANGE            0x02B1
 
ну и остальное
Код
#define WTS_CONSOLE_CONNECT             0x1
#define WTS_CONSOLE_DISCONNECT          0x2
#define WTS_REMOTE_CONNECT              0x3
#define WTS_REMOTE_DISCONNECT           0x4
#define WTS_SESSION_LOGON               0x5
#define WTS_SESSION_LOGOFF              0x6
#define WTS_SESSION_LOCK                0x7
#define WTS_SESSION_UNLOCK              0x8
#define WTS_SESSION_REMOTE_CONTROL      0x9
 

курите это: WM_WTSSESSION_CHANGE Messageи ссылки в ней.

Цитата: morge от 19 Январь 2010, 15:57:15
if (Message.Msg==WM_WTSSESSION_CHANGE) 
Лучше конечно заменить на switch. ну это так...

Если это не поможет, то возможно окно не зарегистрировалось для принятия этого сообщения, т.е возможно она не знает, что она работает в сессии активного пользователя.

ЗЫ пока писал забыл еще что -то как вспомню напишу.
ЗЫ такие вещи предпочитаю писать на VC, хотя это дело вкуса.
Записан
morge
Участник


Сказали спасибо: +2/-0
Offline

Сообщений: 31


Re: получение WTS_SESSION_UNLOCK
« Ответ #2 : 20 Январь 2010, 13:00:29 »

Цитата: Exhale от 20 Январь 2010, 08:39:14
#define WM_WTSSESSION_CHANGE            0x02B1

Если это не поможет, то возможно окно не зарегистрировалось для принятия этого сообщения, т.е возможно она не знает, что она работает в сессии активного пользователя.

ЗЫ пока писал забыл еще что -то как вспомню напишу.
ЗЫ такие вещи предпочитаю писать на VC, хотя это дело вкуса.

Дефайн WM_WTSSESSION_CHANGE в предыдущий раз, когда боролся с этой проблемой добавлял, щас забыл и думал дело не в нём, добавил,
ещё добавил #define WTS_SESSION_UNLOCK эти не добавлял раньше.

а потом изменил
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 WTSRegisterSessionNotification(Application->Handle,NOTIFY_FOR_ALL_SESSIONS);
}

на
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 WTSRegisterSessionNotification(Form1->Handle, NOTIFY_FOR_ALL_SESSIONS);
}

и всё заработало, спасибо
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.119 секунд. Запросов: 20.