В основном WSO предназначено для использования в сценарных языках, в частности потому, что в обычных системах программирования для Windows, как правило, существуют достаточно развитые средства доступа к оконной подсистеме.

Тем не менее, WSO можно использовать и в обычных системах программирования, например в Delphi.

Обычно в таких системах программирования нет стандартных средств для написания обработчиков событий. Для определения событий в Delphi написан простой и небольшой модуль WSO.PAS. Обработчик события передается в WSO путем создания COM-объекта (описанного в модуле WSO.PAS и реализующего частично функцию, описанную в стандарте ECMA 262) с указателем на функцию или процедуру Delphi.

Заметки:
Delphi имеет и так хорошо развитую систему создания интерфейсов и использование WSO здесь неактуально. Этот раздел создан только для примера, чтобы показать, что WSO можно использовать и в подобных системах программирования.
Примеры на языке Pascal находятся в каталоге WSO в подкаталоге Demo\Delphi.

Один из примеров:

//WindowSystemObject (WSO) example
//Copyright (C) Veretennikov A. B. 2004

program Test;

uses
Windows,
ComObj,
ActiveX,
SysUtils,
WSO,
WSOTest,
Variants;

{$R XP.RES}

{$R *.RES}

Var
	t,f,o:OleVariant;

procedure CloseFormHandler(Sender:OleVariant);
begin
	Sender.Form.Close;
end;

procedure ButtonClick(Sender:OleVariant);
begin
	f.MessageBox('Button '+Sender.Text+': OnClick');
end;

procedure FormMouseLeave(Sender:OleVariant);
begin
	f.StatusBar.Text := 'No Mouse in Control';
end;

procedure FormMouseMove(Sender,X,Y,Flags:OleVariant);
begin
	f.StatusBar.Text:=IntToStr(X)+' x '+IntToStr(Y);
end;

procedure FormMouseDown(Sender,X,Y,Button,Flags:OleVariant);
begin
	f.MessageBox(IntToStr(X)+' x '+IntToStr(Y)+', Button: '+IntToStr(Button));
end;

procedure FormKeyDown(Sender,Key,Flags:OleVariant);
begin
	if (Key<>27) and (Key<>112) then f.MessageBox('OnKeyDown, Key = '+IntToStr(Key));
end;

procedure HelpAbout(Sender:OleVariant);
begin
	AboutWSO(Sender,'Event Handler Sample');
end;

Var
	CanClose:Boolean;

procedure OKResult(sender:OleVariant);
begin
	CanClose := true;
	sender.Form.Close;
end;

procedure FormCloseQuery(Sender,ResultPtr:OleVariant);
var
	j,x:OleVariant;
begin
	CanClose := false;
	j := f.CreateDialogForm(0,0,510,100);
	j.CenterControl;
	j.TextOut(10,10,'Do you really want to quit this program?');
	x := j.CreateButton(10,30,75,25,'Yes');
	x.OnClick := TEventHandler.Create(OKResult);
	x.Default := true;
	x := j.CreateButton(90,30,75,25,'No');
	x.OnClick := TEventHandler.Create(CloseFormHandler);
	x.Cancel := true;
	x := j.CreateButton(170,30,75,25,'Help');
	x.OnClick := TEventHandler.Create(HelpAbout);
	j.HelpButton := x;
	j.Color := $FF00FF;
	j.ShowModal;
	j.Destroy;
	ResultPtr.Put(CanClose);
end;

begin
	CoInitialize(nil);
	SetErrorMode(SEM_FAILCRITICALERRORS or SEM_NOGPFAULTERRORBOX or SEM_NOOPENFILEERRORBOX);
	
	o:=CreateOleObject('Scripting.WindowSystemObject');
	
	f:=o.CreateForm(100,100,600,400);
  f.CenterControl;
	
	t:=f.Menu.Add('File');
	t.Add('Exit',27).OnExecute := TEventHandler.Create(CloseFormHandler);
	t:=f.Menu.Add('Help');
	t.Add('About','F1').OnExecute := TEventHandler.Create(HelpAbout);
	
	f.CreateButton(10,10,75,25,'Demo').OnClick := TEventHandler.Create(ButtonClick);
	f.CreateButton(100,10,75,25,'Close').OnClick := TEventHandler.Create(CloseFormHandler);
	f.OnMouseMove := TEventHandler.Create(FormMouseMove);
	f.OnMouseUp := TEventHandler.Create(FormMouseDown);
	f.OnMouseLeave := TEventHandler.Create(FormMouseLeave);
	f.OnKeyDown := TEventHandler.Create(FormKeyDown);
	f.OnCloseQuery := TEventHandler.Create(FormCloseQuery);
	
	t := f.TextOut(10,60,'WindowSystemObject');
	t.Font.Size := 16;
	t.Color := 255;
	t.Font.Bold := true;
	
	f.CreateStatusBar.Name := 'StatusBar';
	f.StatusBar.Add(100).AutoSize:=true;
	
	f.TextOut(10,100,
	'This sample shows how to handle events from WindowsSystemObject using Delphi.'#13#13+
	'Clicking any mouse button invokes OnMouseUp event handler.'#13#13+
	'Moving mouse inside this window invokes OnMouseMove event handler.'#13#13+
	'(The current mouse position is displayed in the status bar)'#13#13+
	'Moving mouse outside this window invokes OnMouseLeave event handler.'#13#13+
	'Clicking Demo or Close buttons invokes OnClick event handler.'#13#13+
	'Pressing any key invokes OnKeyDown event handler.'#13#13+
	'Try to close this window to invoke OnCloseQuery event.');
	
	f.Show;
	
	o.Run;
	
	// Free global OleVariants.
	o := Unassigned;
	t := Unassigned;
	f := Unassigned;
	
	CoUnInitialize;
end.

Документация по WSO 1.1. Последние изменения:Wed Aug 12 18:10:22 2015. (C) Веретенников А. Б. 2004-2015