RemConMessages.pas
上传用户:llfxmlw
上传日期:2009-09-14
资源大小:335k
文件大小:9k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit RemConMessages;
  2. interface
  3. uses SysUtils, Classes, Windows, Graphics, Forms;
  4. const
  5.    // Messages
  6.    // All numbers are 4-byte integers
  7.    // Strings include a null terminating zero
  8.    MSG_LOGON            = 1;     // Client logs on to the server
  9.                                  // Data = password
  10.    MSG_REFRESH          = 2;     // Client wants the entire screen
  11.                                  // Data = Compressed BMP
  12.    MSG_SCREEN_UPDATE    = 3;     // Server sends client a screen update
  13.                                  // Data = Compressed BMP (to XOR)
  14.    MSG_CLICK            = 4;     // Mouse click (single or double, left or right)
  15.                                  // Data = X, Y, Single (1) / Double (2), Left (1) / Right (2)
  16.    MSG_DRAG             = 5;     // Mouse drag
  17.                                  // Data = Left (1) / Right (2), Num Pts, X/Y/time sets
  18.    MSG_KEYS             = 6;     // Send keystrokes
  19.                                  // Data = KeyCode(s)
  20.    MSG_DIRECTORY        = 7;     // Request a directory
  21.                                  // Data = directory (client -> server)
  22.                                  // Data = File StringList (dirs end in ""), Size StringList, Date/Time StringList (server -> client)
  23.    MSG_FILE             = 8;     // Request a file
  24.                                  // Data = Filename (client -> server)
  25.                                  // Data = File Contents
  26.    MSG_SEVER_DELAY      = 9;     // Set the amount of time the server should wait before sending back the screen image
  27.                                  // Data = Delay in milliseconds
  28.    MSG_FOCUS_SERVER     = 10;    // To restore & focus the Server Window
  29.    MSG_VIEW_MODE        = 11;    // Set the view mode for the graphics
  30.                                  // Data = View Mode (TViewMode as integer)
  31.    MSG_STAT_MSG         = 12;    // Generic Status Msg
  32.                                  // Data = Status Message (string)
  33.    MSG_COMP_MODE        = 13;    // Screen Compression Mode
  34.                                  // Data = CompMode (TCompressionLevel as integer)
  35.    MSG_PRIORITY_MODE    = 14;    // Server Thread Priority
  36.                                  // Data = Priority (integer)
  37.    MSG_PROCESS_LIST     = 15;    // List of running processes
  38.                                  // Data = Process StringList
  39.    MSG_CLOSE_WIN        = 16;    // Close one of the running processes (gracefully)
  40.                                  // Data = Process Name (actually Window Name)
  41.    MSG_KILL_WIN         = 17;    // Kill one of the running processes (NOT graceful)
  42.                                  // Data = Process Name (actually Window Name)
  43.    MSG_DRIVE_LIST       = 18;    // Get a list of all the Logical Drives
  44.                                  // Data = Drives StringList
  45.    MSG_REMOTE_LAUNCH    = 19;    // Launch (ShellExecute) a remote file (of any type)
  46.                                  // Data = Filename
  47. type
  48.    TViewMode = (vmColor4, vmGray4, vmGray8, vmColor24, vmDefault);
  49.    procedure GetScreen(var bmp: TBitmap; ViewMode: TViewMode);
  50.    procedure CompressBitmap(bmp: TBitmap; var Data: string);
  51.    procedure UnCompressBitmap(const Data: string; bmp: TBitmap);
  52.    function  IntToByteStr(Value: integer): string;
  53.    function  IsValidMessage(const Msg: string): boolean;
  54.    function  CurTime: string;
  55.    function  MsgLen(const Msg: string): integer;
  56.    function  TrimFirstMsg(var Msg: string): string;
  57.    // Debugging
  58.    procedure SaveString(const s, FileName: string);
  59. implementation
  60. uses ZLib;
  61. type
  62.    TRGBCol = record
  63.       Blu, Grn, Red : byte;
  64.    end;
  65.    TRGBArray   = array[0..0] of TRGBCol;
  66.    PRGBArray   = ^TRGBArray;
  67.    TByteArray = array[0..0] of byte;
  68.    PByteArray = ^TByteArray;
  69. procedure SaveString(const s, FileName: string);
  70. var
  71.    fs : TFileStream;
  72. begin
  73.    fs := TFileStream.Create(FileName, fmCreate);
  74.    fs.Write(s[1], Length(s));
  75.    fs.Free;
  76. end;
  77. function GammaConv(Value: double; Gamma: double): double;
  78. begin
  79.    if Value <> 0 then Result := Exp(Ln(Value) / Gamma)
  80.       else Result := 0;
  81. end;
  82. function CreateGrayPalette(Num: integer; Gamma: double): HPalette;
  83. var
  84.    lPal  : PLogPalette;
  85.    i     : integer;
  86. begin
  87.    // Add the Grayscale palette
  88.    lPal := AllocMem(sizeof(TLogPalette) + Num * sizeof(TPaletteEntry));
  89.    lPal.palVersion   := $300;
  90.    lPal.palNumEntries := Num;
  91.    for i := 0 to Num-1 do with lPal.palPalEntry[i] do begin
  92.       peRed    := Round(255 * GammaConv(i / (Num-1), Gamma));
  93.       peGreen  := Round(255 * GammaConv(i / (Num-1), Gamma));
  94.       peBlue   := Round(255 * GammaConv(i / (Num-1), Gamma));
  95.       peFlags  := 0;
  96.    end;
  97.    Result := CreatePalette(lPal^);
  98.    FreeMem(lPal);
  99.    Win32Check(longbool(Result));
  100. end;
  101. procedure ConvertToGray_256(bmp: TBitmap);
  102. var
  103.    gm       : TBitmap;  // Destination grayscale bitmap
  104.    x, y     : integer;
  105.    p1       : PRGBArray;
  106.    p2       : PByteArray;
  107. begin
  108.    bmp.PixelFormat := pf24bit;
  109.    // Convert to Grayscale
  110.    gm := TBitmap.Create;
  111.    gm.PixelFormat := pf8bit;
  112.    gm.Width  := bmp.Width;
  113.    gm.Height := bmp.Height;
  114.    gm.Palette := CreateGrayPalette(256, 1.4);
  115.    for y := 0 to bmp.Height-1 do begin
  116.       p1 := bmp.ScanLine[y];
  117.       p2 := gm.ScanLine[y];
  118.       for x := 0 to bmp.Width-1 do with p1^[x] do begin
  119.          p2^[x] := (Red * 3 + Grn * 4 + Blu) div 8;
  120.       end;
  121.    end;
  122.    bmp.Assign(gm);
  123.    gm.Free;
  124. end;
  125. procedure ConvertToGray_16(bmp: TBitmap);
  126. var
  127.    gm       : TBitmap;  // Destination grayscale bitmap
  128.    x, y     : integer;
  129.    p1       : PRGBArray;
  130.    p2       : PByteArray;
  131.    c        : integer;
  132. begin
  133.    bmp.PixelFormat := pf24bit;
  134.    // Convert to Grayscale
  135.    gm := TBitmap.Create;
  136.    gm.PixelFormat := pf4bit;
  137.    gm.Width  := bmp.Width;
  138.    gm.Height := bmp.Height;
  139.    gm.Palette := CreateGrayPalette(16, 1.4);
  140.    for y := 0 to bmp.Height-1 do begin
  141.       p1 := bmp.ScanLine[y];
  142.       p2 := gm.ScanLine[y];
  143.       for x := 0 to bmp.Width-1 do with p1^[x] do begin
  144.          c := (Red * 3 + Grn * 4 + Blu) div (8 * 16);
  145.          if (x and 1) = 1 then begin
  146.             p2^[x div 2] := p2^[x div 2] and (not 15) or c;
  147.          end else begin
  148.             p2^[x div 2] := p2^[x div 2] and (15) or (c shl 4);
  149.          end;
  150.       end;
  151.    end;
  152.    bmp.Assign(gm);
  153.    gm.Free;
  154. end;
  155. procedure GetScreen(var bmp: TBitmap; ViewMode: TViewMode);
  156. var
  157.    dc : integer;
  158.    c  : TCanvas;
  159.    R  : TRect;
  160. begin
  161.    bmp := TBitmap.Create;
  162.    dc := GetWindowDC(0);
  163.    try
  164.       c := TCanvas.Create;
  165.       c.Handle := dc;
  166.       R := Rect(0, 0, Screen.Width, Screen.Height);
  167.       bmp.Width := R.Right;
  168.       bmp.Height := R.Bottom;
  169.       bmp.Canvas.CopyRect(R, c, R);
  170.       c.Handle := 0;
  171.       c.Free;
  172.    finally
  173.       ReleaseDC(0, dc);
  174.    end;
  175.    case ViewMode of
  176.       vmColor4    : bmp.PixelFormat := pf4bit;
  177.       vmGray4     : ConvertToGray_16(bmp);
  178.       vmGray8     : ConvertToGray_256(bmp);
  179.       vmColor24   : bmp.PixelFormat := pf24bit;
  180.       vmDefault   : bmp.HandleType := bmDIB;
  181.    end;
  182. end;
  183. procedure CompressBitmap_Slow(bmp: TBitmap; var Data: string);
  184. var
  185.    ms    : TMemoryStream;
  186.    buf   : pointer;
  187.    size  : integer;
  188. begin
  189.    ms := TMemoryStream.Create;
  190.    bmp.SaveToStream(ms);
  191.    CompressBuf(ms.Memory, ms.Size, buf, size);
  192.    SetLength(Data, size);
  193.    Move(buf^, Data[1], size);
  194.    FreeMem(buf);
  195.    ms.Free;
  196. end;
  197. procedure CompressBitmap(bmp: TBitmap; var Data: string);
  198. var
  199.    cs      : TCompressionStream;
  200.    ms      : TMemoryStream;
  201. begin
  202.    ms := TMemoryStream.Create;
  203.    cs := TCompressionStream.Create(clDefault, ms); // clDefault is a LOT faster than clMax
  204.    bmp.SaveToStream(cs);
  205.    cs.Free;
  206.    SetLength(Data, ms.Size);
  207.    Move(ms.Memory^, Data[1], ms.Size);
  208.    ms.Free; 
  209. end;
  210. procedure UnCompressBitmap(const Data: string; bmp: TBitmap);
  211. var
  212.    ms    : TMemoryStream;
  213.    buf   : pointer;
  214.    size  : integer;
  215. begin
  216.    try
  217.       DecompressBuf(@Data[1], Length(Data), Length(Data) * 3, buf, size);
  218.    except
  219.       on E: Exception do begin
  220.          E.Message := Format('Error Decompressing Buffer (Len = %d):'#13#10'%s', [Length(Data), e.Message]);
  221.          raise;
  222.       end;
  223.    end;
  224.    ms := TMemoryStream.Create;
  225.    ms.Write(buf^, size);
  226.    FreeMem(buf);
  227.    ms.Position := 0;
  228.    Assert(bmp<>nil);
  229.    bmp.LoadFromStream(ms);
  230.    ms.Free;
  231. end;
  232. function IntToByteStr(Value: integer): string;
  233. begin
  234.    SetLength(Result, 4);
  235.    Move(Value, Result[1], sizeof(integer));
  236. end;
  237. function IsValidMessage(const Msg: string): boolean;
  238. var
  239.    len : integer;
  240. begin
  241.    Result := False;
  242.    len := Length(Msg);
  243.    if len < 8 then exit;
  244.    if MsgLen(Msg) > len then exit;
  245.    Result := True;
  246. end;
  247. function MsgLen(const Msg: string): integer;
  248. var
  249.    len, mlen : integer;
  250. begin
  251.    len := Length(Msg);
  252.    Assert(len >= 8);
  253.    Move(Msg[5], mlen, sizeof(integer));
  254.    Result := mlen + 8;
  255. end;
  256. function TrimFirstMsg(var Msg: string): string;
  257. begin
  258.    Result := Copy(Msg, 1, MsgLen(Msg));
  259.    Msg := Copy(Msg, MsgLen(Msg)+1, Length(Msg));
  260. end;
  261. function CurTime: string;
  262. begin
  263.    Result := FormatDateTime('mmm d, yyyy  hh:nn:ss ampm', Now);
  264. end;
  265. end.