Thursday, August 07, 2008

Vytvoříme si proto malou ukázkovou aplikaci, která bude toto přepínání hlídat. Poslouží nám k tomu dvě funkce. První zařídí, aby aplikace dostávala od systému upozornění na změnu session (tu použijeme při spuštění programu), druhou funkcí zase toto upozorňování zrušíme (při ukončení programu). Ještě přidáme navíc funkci pro detekci čísla aktuální session. V konstantách budou uloženy názvy jednotlivých stavů session (a zřejmě nemá cenu je překládat do češtiny, takže je ponechávám v původní podobě) a všechny výpisy budou prováděny do komponenty Memo. Umístěte ji proto na prázdný formulář. Jelikož totiž po přepnutí uživatele nebudete mít k aplikaci přístup, bude záznam o této změně vypsán právě do komponenty Memo a po opětovném přepnutí zpět si můžete jednotlivé stavy prohlédnout. Poslední věcí je tlačítko, které rovněž přidejte na formulář. Po jeho stisku bude zobrazeno číslo session, což má v tomto případě spíše ukázkový charakter, protože budete vidět vždy jen vaší aktuální session (po přepnutí na jiného uživatele pochopitelně tlačítko nepůjde stisknout, protože neuvidíte vůbec samotnou aplikaci). V "ostrých" aplikacích však tato funkce své využití jistě najde a rovněž místo výpisu daných stavů do Memo se bude aplikace chovat jinak. A zde tedy již samotný kód. Pro dnešek opět kompletní unit pro snadnější zkopírování do Delphi.
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

const

WM_WTSSESSION_CHANGE = $2B1;
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;
NOTIFY_FOR_THIS_SESSION = 0;
NOTIFY_FOR_ALL_SESSIONS = 1;

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
FRegisteredSessionNotification : Boolean;
procedure AppMessage(var Msg: TMSG; var HAndled: Boolean);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation