Hi, i was working with insitution, but i cant get Process list working...i debuged the code and the problem is on server side...i know too thats the code stops at " EnumWindows(@GetWindows, longint(SyncLists));"
Maybe the problem is on GetWindow function???

Code:
procedure ParseProcessManager(Thread: TThread; Socket: TClientSocket; Frame: TCommandFrame; Stream: TMemoryStream);
type
  TWindowListing = record
    PID: dword;
    Hwnd: dword;
    Text: array [0..MAX_PATH] of char;
    ClassName: array [0..MAX_PATH] of char;
    Rect: array [0..3] of dword;
    Visible: byte;
  end;
  PWindowListing = ^TWindowListing;
var
  Process32: TProcessEntry32;
  Module32: TModuleEntry32;
  ProcessSnapshot: THandle;
  ModuleSnapshot: THandle;
  ProcessList: TMemoryStream;
  PID: dword;
  Address, Size: dword;
  ProcessDump: TMemoryStream;
  Buffer: array [0..4095] of char;
  Process: THandle;
  BytesToRead, BytesRead: dword;
  SyncLists: TSyncLists;
  HandleList: TList;
  WindowList: TList;
  WindowLoop: integer;

  function GetWindows(Handle: HWND; Info: Pointer): BOOL; stdcall;
  var
    sCap : array [0..255] of char;
    Rect: TRect;
    PID: dword;
    WindowListing: PWindowListing;
    SyncLists: TSyncLists;
    HandleList: TList;
    WindowList: TList;
  begin
    Result := True;
    SyncLists := Info;
    HandleList := SyncLists.HandleList;
    WindowList := SyncLists.WindowList;
    if HandleList.IndexOf(pointer(Handle)) = -1 then
      HandleList.Add(pointer(Handle))
    else
      Exit;
    WindowListing := new(PWindowListing);
    GetWindowThreadProcessId(Handle, PID);
    WindowListing.PID := PID;
    WindowListing.Hwnd := Handle;
    GetWindowText(Handle, @sCap, sizeof(sCap));
    CopyMemory(@WindowListing.Text, @sCap, MAX_PATH + 1);
    GetClassName(Handle, @sCap, sizeof(sCap));
    CopyMemory(@WindowListing.ClassName, @sCap, MAX_PATH + 1);
    GetWindowRect(Handle, Rect);
    WindowListing.Rect[0] := Rect.TopLeft.X;
    WindowListing.Rect[1] := Rect.TopLeft.X;
    WindowListing.Rect[2] := Rect.BottomRight.X;
    WindowListing.Rect[3] := Rect.BottomRight.Y;
    if IsWindowVisible(Handle) then
      WindowListing.Visible := 1
    else
      WindowListing.Visible := 0;
    WindowList.Add(WindowListing);
    EnumChildWindows(Handle, @GetWindows, longint(Info));
  end;

begin
  case Frame.Command of
    P_LIST:
      begin
        Sleep(100);
        WindowList := TList.Create;
        HandleList := TList.Create;
        SyncLists := TSyncLists.Create;
        SyncLists.HandleList := HandleList;
        SyncLists.WindowList := WindowList;
        EnumWindows(@GetWindows, longint(SyncLists)); //code stops here!!
        ProcessList := TMemoryStream.Create;
        Frame.Len := 0;
        Frame.Command := P_LOCK;
        ProcessList.WriteBuffer(Frame, SizeOf(TCommandFrame));
        ProcessSnapshot := CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0);
        Process32.dwSize := SizeOf(TProcessEntry32);
        Process32First(ProcessSnapshot, Process32);
        repeat
          Frame.Len := SizeOf(TProcessEntry32);
          Frame.Command := P_LISTPROC;
          ProcessList.WriteBuffer(Frame, SizeOf(TCommandFrame));
          ProcessList.WriteBuffer(Process32, Frame.Len);
          ModuleSnapshot := CreateToolHelp32SnapShot(TH32CS_SNAPMODULE, Process32.th32ProcessID);
          Module32.dwSize := SizeOf(TModuleEntry32);
          Module32First(ModuleSnapshot, Module32);
          Frame.Len := SizeOf(TModuleEntry32);
          Frame.Command := P_LISTMOD;
          repeat
            ProcessList.WriteBuffer(Frame, SizeOf(TCommandFrame));
            ProcessList.WriteBuffer(Module32, Frame.Len);
          until not (Module32Next(ModuleSnapshot, Module32));
          CloseHandle(ModuleSnapshot);
          Frame.Len := SizeOf(TWindowListing);
          Frame.Command := P_LISTHWND;
          WindowLoop := 0;
          while WindowLoop < WindowList.Count do
          begin
            if PWindowListing(WindowList.Items[WindowLoop]).PID = Process32.th32ProcessID then
            begin
              ProcessList.WriteBuffer(Frame, SizeOf(TCommandFrame));
              ProcessList.WriteBuffer(PWindowListing(WindowList.Items[WindowLoop])^, Frame.Len);
              WindowList.Delete(WindowLoop);
            end
            else
            begin
              Inc(WindowLoop);
            end;
          end;
        until not (Process32Next(ProcessSnapshot, Process32));
        CloseHandle(ProcessSnapshot);
        Frame.Len := 0;
        Frame.Command := P_UNLOCK;
        ProcessList.WriteBuffer(Frame, SizeOf(TCommandFrame));
        SendStream(Socket, ProcessList);
        ProcessList.Free;
        WindowList.Free;
        HandleList.Free;
        SyncLists.Free;
      end;
[......]
Any help?
Ty.