delphi3000.com - the free delphi knowledge platform
delphi3000.com - the free delphi knowledge platform
490 Users Online NOW
Have a look at your member-status

connecting people's knowledge


  - Recent ArticlesRSS feed for Recent Articles on delphi3000.com
  - List of All Articles
  - Top Viewed Articles
  - Articles (+Attachem.)
  - Articles Of Interest
  - Categories
  - Top Uploader
  - Search
  - Index

  - My Home
  - Submit an Article
  - My Articles
  - My Personal Data
  - My Bookmarks
  - Activities
  - Login/Logout

  - Sign Up
  - Why Sign Up
  - Newsletter

  - Press
  - Advertise

  - Contact
  - Feedback





Community
Borland
ClubeDelphi
Dr. Bob
UK-BUG
Delphi Meetings
Planeta Delphi



Loremo - the 1.5 liter car coming in 2009




Startblatt.de






Share this article with friendsShare this article with friends
Rate this articleRate this article - to keep the quality of delphi3000.com !
Comment this article or read through previous comments (0)


How to receive session switch notifications (XP) ?Format this article printer-friendly!Bookmark function is only available for registered users!
Product:
Delphi 3.x (or higher)
Category:
Win API
Skill Level:
Scoring:
Last Update:
06/20/2002
Search Keys:
delphi delphi3000 article borland vcl code-snippet WTSRegisterSessionNotification WTSUnRegisterSessionNotification WM_WTSSESSION_CHANGE
Times Scored:
5
Visits:
2565
Uploader: Thomas Stutz
Company:
Reference: SwissDelphiCenter.com
 
Question/Problem/Abstract:
How can I receive the WM_WTSSESSION_CHANGE message when a session switch occurs ?
Answer:



  Typically, an application does not need to be notified when a session switch
  occurs. However, if the application needs to be aware when its desktop is
  current, it can register for session switch notifications. Applications that
  access the serial port or another shared resource on the computer should
  check for this. To register for a notification, use the following function:


  function WTSRegisterSessionNotification(
      hWnd: HWND;    // Window handle
      dwFlags: DWORD  // Flags
      ): Bool; // Return value


  The registered HWND receives the message WM_WTSSESSION_CHANGE
  through its WindowProc function.

  In dwFlags you can specify:

    a) NOTIFY_FOR_THIS_SESSION. A window is notified only about the session
      change events that affect the session to which window belongs.

    b) NOTIFY_FOR_ALL_SESSIONS. A window is notified for all session change
      events.

  The action happening on the session can be found in wParam code, which may
  contain one of the following flags.

  WTS_CONSOLE_CONNECT:        A session was connected to the console session.
  WTS_CONSOLE_DISCONNECT:     A session was disconnected from the console session.
  WTS_REMOTE_CONNECT:         A session was connected to the remote session.
  WTS_REMOTE_DISCONNECT:      A session was disconnected from the remote session.
  WTS_SESSION_LOGON:          A user has logged on to the session.
  WTS_SESSION_LOGOFF:         A user has logged off the session.
  WTS_SESSION_LOCK:           A session has been locked.
  WTS_SESSION_UNLOCK:         A session has been unlocked.
  WTS_SESSION_REMOTE_CONTROL: A session has changed its remote controlled status.


  lParam contains the sessionId for the session affected.

  When your process no longer requires these notifications or is terminating,
  it should call the following to unregister its notification.


  function WTSUnRegisterSesssionNotification(
    hWnd: HWND // window handle.
    ): Boolean; // Result



  The HWND values passed to WTSRegisterSessionNotification are reference
  counted, so you must call WTSUnRegisterSessionNotification exactly the same
  number of times that you call WTSRegisterSessionNotification.

  Applications can use the WTS_CONSOLE_CONNECT, WTS_CONSOLE_DISCONNECT,
  WTS_REMOTE_CONNECT, WTS_REMOTE_DISCONNECT messages to track their state, as
  well as to release and acquire console specific resources.



{********************************************************************
  Unit Wtsapi
********************************************************************}

Unit Wtsapi;

interface

{
  Copyright(c) By Thomas Stutz
  Date: 10. April 2002
  Version: 1.0.0
}

uses
  
Windows;

const
  
// The WM_WTSSESSION_CHANGE message notifies applications of changes in session state.
  
WM_WTSSESSION_CHANGE = $2B1;

  // wParam values:
  
WTS_CONSOLE_CONNECT = 1;
  WTS_CONSOLE_DISCONNECT = 2;
  WTS_REMOTE_CONNECT = 3;
  WTS_REMOTE_DISCONNECT = 4;
  WTS_SESSION_LOGON = 5;
  WTS_SESSION_LOGOFF = 6;
  WTS_SESSION_LOCK = 7;
  WTS_SESSION_UNLOCK = 8;
  WTS_SESSION_REMOTE_CONTROL = 9;

  // Only session notifications involving the session attached to by the window
  // identified by the hWnd parameter value are to be received.
  
NOTIFY_FOR_THIS_SESSION = 0;
  // All session notifications are to be received.
  
NOTIFY_FOR_ALL_SESSIONS = 1;


function RegisterSessionNotification(Wnd: HWND; dwFlags: DWORD): Boolean;
function UnRegisterSessionNotification(Wnd: HWND): Boolean;
function GetCurrentSessionID: Integer;

implementation

function 
RegisterSessionNotification(Wnd: HWND; dwFlags: DWORD): Boolean;
  // The RegisterSessionNotification function registers the specified window
  // to receive session change notifications.
  // Parameters:
  // hWnd: Handle of the window to receive session change notifications.
  // dwFlags: Specifies which session notifications are to be received:
  // (NOTIFY_FOR_THIS_SESSION, NOTIFY_FOR_ALL_SESSIONS)
type
  
TWTSRegisterSessionNotification = function(Wnd: HWND; dwFlags: DWORD): BOOL; stdcall;
var
  
hWTSapi32dll: THandle;
  WTSRegisterSessionNotification: TWTSRegisterSessionNotification;
begin
  
Result := False;
  hWTSAPI32DLL := LoadLibrary('Wtsapi32.dll');
  if (hWTSAPI32DLL > 0) then
  begin
    try 
@WTSRegisterSessionNotification :=
        GetProcAddress(hWTSAPI32DLL, 'WTSRegisterSessionNotification');
      if Assigned(WTSRegisterSessionNotification) then
      begin
        
Result:= WTSRegisterSessionNotification(Wnd, dwFlags);
      end;
    finally
      if 
hWTSAPI32DLL > 0 then
        
FreeLibrary(hWTSAPI32DLL);
    end;
  end;
end;

function UnRegisterSessionNotification(Wnd: HWND): Boolean;
  // The RegisterSessionNotification function unregisters the specified window
  // Parameters:
  // hWnd: Handle to the window
type
  
TWTSUnRegisterSessionNotification = function(Wnd: HWND): BOOL; stdcall;
var
  
hWTSapi32dll: THandle;
  WTSUnRegisterSessionNotification: TWTSUnRegisterSessionNotification;
begin
  
Result := False;
  hWTSAPI32DLL := LoadLibrary('Wtsapi32.dll');
  if (hWTSAPI32DLL > 0) then
  begin
    try 
@WTSUnRegisterSessionNotification :=
        GetProcAddress(hWTSAPI32DLL, 'WTSUnRegisterSessionNotification');
      if Assigned(WTSUnRegisterSessionNotification) then
      begin
        
Result:= WTSUnRegisterSessionNotification(Wnd);
      end;
    finally
      if 
hWTSAPI32DLL > 0 then
        
FreeLibrary(hWTSAPI32DLL);
    end;
  end;
end;

function GetCurrentSessionID: Integer;
// Getting the session id from the current process
type
  
TProcessIdToSessionId = function(dwProcessId: DWORD; pSessionId: DWORD): BOOL; stdcall;
var
  
ProcessIdToSessionId: TProcessIdToSessionId;
  hWTSapi32dll: THandle;
  Lib : THandle;
  pSessionId : DWord;
begin
  
Result := -1;
  Lib := GetModuleHandle('kernel32');
  if Lib <> 0 then
  begin
    
ProcessIdToSessionId := GetProcAddress(Lib, '1ProcessIdToSessionId');
    if Assigned(ProcessIdToSessionId) then
    begin
      
ProcessIdToSessionId(GetCurrentProcessId(), DWORD(@pSessionId));
      Result:= pSessionId;
    end;
  end;
end;

end.


{********************************************************************
  Example:
********************************************************************}

unit Unit1;

interface

uses
  
Windows, Messages, {...},  Wtsapi;

type
  
TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
  
{ Private declarations }
    
FRegisteredSessionNotification : Boolean;
    procedure AppMessage(var Msg: TMSG; var HAndled: Boolean);
  end;

var
  
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.AppMessage(var Msg: TMSG; var Handled: Boolean);
var
  
strReason: string;
begin
  
Handled := False;
  // Check for WM_WTSSESSION_CHANGE message
  
if Msg.Message = WM_WTSSESSION_CHANGE then
  begin
     case 
Msg.wParam of
       
WTS_CONSOLE_CONNECT:
           strReason := 'WTS_CONSOLE_CONNECT';
       WTS_CONSOLE_DISCONNECT:
           strReason := 'WTS_CONSOLE_DISCONNECT';
       WTS_REMOTE_CONNECT:
           strReason := 'WTS_REMOTE_CONNECT';
       WTS_REMOTE_DISCONNECT:
           strReason := 'WTS_REMOTE_DISCONNECT';
       WTS_SESSION_LOGON:
           strReason := 'WTS_SESSION_LOGON';
       WTS_SESSION_LOGOFF:
           strReason := 'WTS_SESSION_LOGOFF';
       WTS_SESSION_LOCK:
           strReason := 'WTS_SESSION_LOCK';
       WTS_SESSION_UNLOCK:
           strReason := 'WTS_SESSION_UNLOCK';
       WTS_SESSION_REMOTE_CONTROL:
           begin
             
strReason := 'WTS_SESSION_REMOTE_CONTROL';
             // GetSystemMetrics(SM_REMOTECONTROL);
           
end;
      else
        
strReason := 'WTS_Unknown';
     end;
   // Write strReason to a Memo
   
Memo1.Lines.Add(strReason + ' ' + IntToStr(msg.Lparam));
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  
// register the window to receive session change notifications.
  
FRegisteredSessionNotification := RegisterSessionNotification(Handle, NOTIFY_FOR_THIS_SESSION);
  Application.OnMessage := AppMessage;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  
// unregister session change notifications.
  
if FRegisteredSessionNotification then
    
UnRegisterSessionNotification(Handle);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
// retrieve current session ID
  
ShowMessage(Inttostr(GetCurrentSessionID));
end;






Please rate this article!
Skill level:
BeginnerExpert

Useful:
No!Very!

Overall rating:
PoorExcellent



Comments to this article
Write a new comment













 
Sign up to consume product discounts for Bronze memberships !

read more


  Visit our Sponsor

 

  Community Ad of
I. Siticov
 
   














 







     
  Copyright © 2000 - 2007 delphi3000.com - All rights reserved. Terms of use. || Privacy
delphi3000.com is a service by bluestep.com IT-Services GmbH (Vienna)