用EnumWindows枚举窗口,然后在回调函数里判断如果窗口是可见的,则将程序数量加1,这样应该可以获得程序数。
=============================
期待更好的解决方法!

解决方案 »

  1.   

    只是想得到有窗口的程序?后台运行的不算吗?
    enumwindows倒是不难的,
    BOOL EnumWindows(
      WNDENUMPROC lpEnumFunc,  // callback function
      LPARAM lParam            // application-defined value
    );BOOL CALLBACK EnumWindowsProc(
      HWND hwnd,      // handle to parent window
      LPARAM lParam   // application-defined value
    );
    //////////////////////////////////////////////////////
    procedure TForm1.FormShow(Sender: TObject);
    var I : integer;
    begin
      EnumWindows(@WndEnumProc,LongInt(ListView1));
      {for I := Listview1.Items.Count - 1 downto 0 do begin
        if Listview1.Items[i].Caption  = '' then
          Listview1.Items.Delete(i);
      end;}
    end;function WndEnumProc(H: Hwnd; LParam : TListview): boolean;
    var
      Buff : PChar;
    begin
      Result := true;
      GetMem(Buff,255);
      GetWindowText(H, Buff, 255);
      //if buff <> '' then
      //;LParam.Items.Add();
      //Add);
      New(X);
      X^.Caption := StrPas(Buff);
      X^.HND := H;
      with LParam.Items.Add do begin
        Caption := X^.Caption;
        Data := X;
      end;
    //  L.Add(X);
      FreeMem(Buff);
    end;
    声明是这样的;
    function WndEnumProc(H : Hwnd; LParam : TListView): boolean; StdCall;type
      Pa = ^Ta;
      Ta = record
      Caption : string;
      HND : Hwnd;
    end;