比如我创建虚拟桌面,并将某些程序运行于虚拟桌面内.
当我枚举进程的时候,如何判断其中某些进程是在虚拟桌面中运行?
谢谢了~

解决方案 »

  1.   

    声明一个结构,有两个成员:1.进程id,2.虚拟桌面名。然后实例化为一个动态一维数组,创建进程后,动态增加一维该数组,记录进程ID及桌面名。遍布进程得到每个进程的id,判断id是否存在于数组,存在则说明是在虚拟桌面中运行,不存在则说明是在系统默认default桌面运行。
    还有一种方法应该是想办法取得每个进程的TStartupInfo信息,然后判断它的.lpDesktop来区别。
    这么难的问题亏你才给这一点分,我就给你些友情提示吧,希望对你有所帮助!
      

  2.   

    谢谢你的回答 你的方法是记录进程ID来判断的
    但我对于进程是未知的 比如我在虚拟桌面里打开A 而A会打开B和C 它们都存在于虚拟桌面里
    这些都是未知的 我是想过有什么可以通过枚举进程的结构来获取 但太菜了 不懂
      

  3.   

    未知的话就考虑在TStartupInfo上找出突破口吧,别谦虚了,菜鸟一般不会研究这样问题的。
      

  4.   

    我看你就是最大的菜鸟,不是我说看看你的回帖哪个有什么含量,都是冲着分来的,你这样的菜鸟不会就不要误人子弟。
    function GetParentProcessId(const hProcessId: THandle): DWORD; //获取指定进程的父进程PID
    type
      PNtQueryInformationProcess = function(ProcessHandle: Thandle; PrcInfoClass: DWORD; PrcInfo: Pointer; PrcInfoLength: ULONG; returnlength: PULONG): DWORD; stdcall;
      TPROCESS_BASIC_INFORMATION = record
        ExitStatus: DWORD;
        PebBaseAddress: DWORD;
        AffinityMask: DWORD;
        BasePriority: DWORD;
        UniqueProcessId: ULONG;
        InheritedFromUniqueProcessId: ULONG
      end;
    var
      _Status: Dword;
      _INF: TPROCESS_BASIC_INFORMATION;
      _Library: Dword;
      _NtQueryInformationProcess: PNtQueryInformationProcess;
    begin
      Result := 0;
      FillChar(_INF, SizeOf(TPROCESS_BASIC_INFORMATION), 0);
      _Library := LoadLibrary('ntdll.dll');
      _NtQueryInformationProcess := GetProcAddress(_Library, 'NtQueryInformationProcess');
      _Status := _NtQueryInformationProcess(hProcessId, 0, @_INF, SizeOf(TPROCESS_BASIC_INFORMATION), nil);
      if _Status = 0 then Result := _INF.InheritedFromUniqueProcessId;
    end;
    枚举进程时候把进程pid放进去调用得到它父进程Pid 你对比下父进程Pid 是否是你的虚拟桌面的Pid就知道是否运行于虚拟桌面上。
      

  5.   

    对,我是冲着分来的。这又有什么不可?我没说我是高手啊。
    既然是区分运行于指定的区域桌面,创建时记录起来就OK了。你所说的方法行不同,因为如果用户切入虚拟桌面后用鼠标双击某个exe启动后,该exe的父进程仍然是explorer.exe
      

  6.   


    不知道你们怎么想的,假设A是你的虚拟桌面,那么当A打开B ,然后B再打开C,这时候C的父进程就是B,B的父进程就是A,要知道C是不是A的子进程只需要一直递归到最顶层父类的Pid就知道是否是你的虚拟桌面A了。另外对于你的混乱思维直接懒得回你。
      

  7.   

    虽然不欣赏mwy654321一贯的作风,
    我测试在虚拟桌面打开进程,新进程的父进程ID还是 explorer.exe的进程ID,和正常桌面explorer.exe的ID一样
      

  8.   

    我这里测试是用True Launch Bar 一个快速启动桌面 查看是可以的,关键看他虚拟桌面怎么创建进程的
      

  9.   

    知道鼠标双击创建的细节么?压根你就不知道,鼠标在桌面双击创建本质是explorer.exe这个进程CreateProcess的子进程,说了你也不明白。
      

  10.   


    鼠标双击当然是explorer.exe进程创建,使用过“超级巡警”杀毒软件的人都知道,在启动任意exe时都会提示进程的来源(父进程)。说了我也不明白?父进程这个很简单吧。我看是你在回避问题的漏洞吧。判断父进程根本行不通,因为进程的创建方式是各种各样,如果有漏洞的方法都不可取。
      

  11.   

    用tlhelp32的函数,获取进程的线程
    然后用GetThreadDesktop获取线程所在的desktop