Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 195 - Detekce VMware; Omezení pohybu okna mimo vyhrazený prostor

Jan Šindelář 3.8.2005

Pokračujeme v minulém mixu a tentokrát se podíváme na detekci virtuálního počítače VMware a na možnosti omezení pohybu okna po pracovní ploše.

Detekce VMware

Dnes je doba různých emulátorů, virtualizerů a dalších obdobných systémů, které umožňují komplexně simulovat běh virtuálního počítače v rámci počítače skutečného. Pomocí tohoto specializovaného software (asi nejznámější jsou produkty VMware a VirtualPC) pak lze například v okně této aplikace, která běží pod Windows, provozovat zcela jiný operační systém či více systémů současně (podle výkonu vaše skutečného počítače).

Tyto speciální emulátory, virtuální počítače, mohou sloužit například k testování software, ke zkoušení síťovch programů (mezi skutečným a virtuálním počítačem můžeme navázat síťové spojení) a podobně.

My se dnes naučíme detekovat, jestli náš program právě v rámci nějakého virtuálního systému neběží. Sice mě nenapadá reálné využití, ale pokud potřebujete mít jistotu, že váš program není spuštěn na nějaké "náhražce", můžete do vašich aplikací tento test zařadit.

Kód je napsán v assembleru, detekuje pouze VMware a předkládám vám jej v mírně upravené podobě (originál v C najdete zde). Na původních stránkách také naleznete detailnější vysvětlení celé problematiky, jejíž rozsah přesahuje rámec tohoto seriálu a pokud se chcete o problém hlouběji zajímat, vřele doporučuji článek přečíst. Ostatním, kterým stačí hotová funkce, je pak určen níže uvedený kód.

Omezení pohybu okna mimo vyhrazený prostor

Uživatelské prostředí vaší aplikace můžete vylepšit o další vymoženost, která ovšem tak trochu hraničí se svobodnou vůlí uživatele. Jednoduchým způsobem můžeme zajistit, aby formulář naší aplikace nešlo přesunout mimo pracovní plochu. Uživatel si tedy nemůže "odložit" okno našeho programu stranou tak, aby byl vidět jen okraj a zbytek byl zcela mimo plochu (občas to sám dělám), ale okno bude moct přesouvat pouze v rámci viditelného desktopu. Toto omezení se týká i hlavního panelu, takže ani "pod něj" nepůjde okno zasunout.

Vše je uděláno jak jinak než prostřednictvím zpráv systému. Pomocí příslušné zprávy budeme schopni detekovat přesun okna a pak už si jen pohlídáme souřadnice, přičemž nedovolíme překročení definovaných hranic.


unit Unit1;

interface
uses Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms, Dialogs, StdCtrls; type TWMMoving = record Msg: Cardinal; fwSide: Cardinal; lpRect: PRect; Result: Integer; end; TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } procedure OnMoving(var Msg: TWMMoving); message WM_MOVING; public { Public declarations } end; var Form1: TForm1;
implementation
{$R *.dfm}
function VMWare: Boolean; var rc: Boolean; begin rc := False; try asm push edx push ecx push ebx mov eax, `VMXh` mov ebx, 0 mov ecx, 10 mov edx, `VX` in eax, dx cmp ebx, `VMXh` setz [rc] pop ebx pop ecx pop edx end; except on EPrivilege do rc := False; end; Result := rc; end;
procedure TForm1.OnMoving(var Msg: TWMMoving); var scrArea: TRect; begin scrArea := Screen.WorkareaRect; if msg.lprect^.Left < scrArea.left then
OffsetRect(msg.lprect^, scrArea.Left - msg.lpRect^.Left, 0); if msg.lprect^.Top < scrArea.top then
OffsetRect(msg.lprect^, 0, scrArea.Top - msg.lprect^.Top); if msg.lprect^.Right > scrArea.Right then
OffsetRect(msg.lprect^, scrArea.right - msg.lprect^.Right, 0); if msg.lprect^.Bottom > scrArea.Bottom
then
OffsetRect(msg.lprect^, 0, scrArea.bottom - msg.lprect^.Bottom); inherited; end; procedure TForm1.Button1Click(Sender: TObject); begin if VMWare then ShowMessage(`Program spusten pod VMware`) else ShowMessage(`Program bezi ve skutecnem systemu`); end; end.


Zdrojový kód této funkce asi není třeba nijak dál komentovat. Je jasné, že bychom tímto způsobem mohli omezit pohyb okna na libovolný čtyřúhelník a ne jen pracovní plochu, jejíž rozměry získáváme v tomto případě přes Screen.WorkareaRect.

I tentokrát je k dispozici hotový ukázkový projekt, který si můžete stáhnout zde.