PDA

Ver la Versión Completa : Uso del CPU en 9x


cHackAll
12-08-2007, 01:47:22
uses Windows;
begin
_lwrite(_lcreat('cpu.res', 0), PChar(#0#0#0#0#32#0#0#0#$FF#$FF#0#0#$FF#$FF#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#40#1#0#0#32#0#0#0#$F F#$FF#3#0#$FF#$FF#1#0#0#0#0#0#16+
#16#10#64#0#0#0#0#0#0#0#0#40#0#0#0#16#0#0#0#32#0#0#0#1#0#4#0#0#0#0#0#$C0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 #0#0#0#0#0#0#0#0#0#0#0#$80+
{ Ésta "línea" de código crea el } #0#0#$80#0#0#0#$80#$80#0#$80#0#0#0#$80#0#$80#0#$80#$80#0#0#$80#$80#$80#0#$C0#$C0#$C0#0#0#0#$FF#0#0#$ FF#0#0#0#$FF#$FF#0#$FF#0#0+
{ recurso necesario para compilar } #0#$FF#0#$FF#0#$FF#$FF#0#0#$FF#$FF#$FF#0#2#34#34#34#34#34#34#32#0#32#32#32#32#32#32#32#2#34#34#34#34 #34#34#32#0#32#32#32#32#32+
{ el medidor de uso del CPU. Para } #32#32#2#34#34#34#34#34#34#32#0#32#32#32#32#32#32#32#2#34#34#34#34#34#34#32#0#32#32#32#32#32#32#32#2 #34#34#34#34#34#34#32#0#32+
{ ambos casos, se debe copiar su } #32#32#32#32#32#32#2#34#34#34#34#34#34#32#0#32#32#32#32#32#32#32#2#34#34#34#34#34#34#32#0#32#32#32#3 2#32#32#32#2#34#34#34#34#34+
{ "contenido" en un archivo nuevo } #34#32#0#32#32#32#32#32#32#32#$80#1#0#0#$80#1#0#0#$80#1#0#0#$80#1#0#0#$80#1#0#0#$80#1#0#0#$80#1#0#0# $80#1#0#0#$80#1#0#0#$80#1#0+
{ con extensión ".dpr" } #0#$80#1#0#0#$80#1#0#0#$80#1#0#0#$80#1#0#0#$80#1#0#0#$80#1#0#0#20#0#0#0#32#0#0#0#$FF#$FF#14#0#$FF#$F F#$64#0#0#0#0#0#16#16#10#64+
#0#0#0#0#0#0#0#0#0#0#1#0#1#0#16#16#16#0#1#0#4#0#40#1#0#0#1#0), $19C);
end.

cpu, es un pequeño programita que nació para imitar lo que más me llamaba la atención del "Administrador de tareas" del Güindos eQuispe en 9x. El mayor logro en el mismo fue poder utilizar 16 iconos diferentes sin la necesidad de "incrustar" 16 iconos en la aplicación. El método de verificación de versión del S.O. también fue una innovación en la época en que ignoraba que Microsoft ya no daba soporte a estos DinosauriOS.

uses Windows, ShellAPI, Types; {$r cpu.res} {$warnings off} // 050216

function RegisterServiceProcess(Address: Pointer): Cardinal;
asm
mov ecx, eax
jecxz @IsNT
push 01h
call GetCurrentProcessID
push eax
call ecx
@IsNT:
end;

var
Dummy, Canvas: Cardinal;
Saved: Cardinal = $00000010;
IconInfo: TIconInfo;
Icons: array[0..15] of HICON;
TrayIcon: TNotifyIconData = (cbSize: SizeOf(TNotifyIconData); uFlags: NIF_ICON);
hKey: Windows.HKEY;

function GetCPUUsage: Cardinal;
var Size: Cardinal;
begin
Size := SizeOf(Result);
RegQueryValueEx(hKey, 'KERNEL\CPUUsage', nil, nil, @Result, @Size);
end;

procedure RegOpenKey(const lpSubKey: PChar);
begin
RegCloseKey(hKey);
RegOpenKeyEx(HKEY_DYN_DATA, lpSubKey, 0, KEY_READ, hKey);
GetCPUUsage;
end;

begin
CreateMutex(nil, True, 'cpu');
if (GetLastError = ERROR_ALREADY_EXISTS) or (RegisterServiceProcess(GetProcAddress(GetModuleHandle('kernel32.dll'), 'RegisterServiceProcess')) = 0) then Exit;

Dummy := GetDC(0);
Canvas := CreateCompatibleDC(Dummy);
ReleaseDC(0, Dummy);

Icons[0] := LoadIcon(hInstance, MAKEINTRESOURCE(100));
GetIconInfo(Icons[0], IconInfo);
SelectObject(Canvas, IconInfo.hbmColor);
Dummy := CreateSolidBrush(RGB(0, 255, 0));
repeat Dec(Saved);
FillRect(Canvas, Rect(2, (Saved * 2) + 1, 30, 32), Dummy);
Icons[16 - Saved] := CreateIconIndirect(IconInfo);
until Saved = 0;

TrayIcon.hIcon := Icons[0];
TrayIcon.Wnd := FindWindow('Shell_TrayWnd', nil);
Shell_NotifyIcon(NIM_ADD, @TrayIcon);

RegOpenKey('PerfStats\StartStat');
RegOpenKey('PerfStats\StatData');
repeat Sleep(250);
Dummy := GetCPUUsage div 6;
if Saved <> Dummy then
begin
Saved := Dummy;
TrayIcon.hIcon := Icons[Dummy];
Shell_NotifyIcon(NIM_MODIFY, @TrayIcon);
end;
until FindWindow('Shell_TrayWnd', nil) = 0;
RegOpenKey('PerfStats\StopStat');
RegCloseKey(hKey);
end.