如何判断进程是否在虚拟桌面中运行? 比如我创建虚拟桌面,并将某些程序运行于虚拟桌面内.当我枚举进程的时候,如何判断其中某些进程是在虚拟桌面中运行?谢谢了~ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 声明一个结构,有两个成员:1.进程id,2.虚拟桌面名。然后实例化为一个动态一维数组,创建进程后,动态增加一维该数组,记录进程ID及桌面名。遍布进程得到每个进程的id,判断id是否存在于数组,存在则说明是在虚拟桌面中运行,不存在则说明是在系统默认default桌面运行。还有一种方法应该是想办法取得每个进程的TStartupInfo信息,然后判断它的.lpDesktop来区别。这么难的问题亏你才给这一点分,我就给你些友情提示吧,希望对你有所帮助! 谢谢你的回答 你的方法是记录进程ID来判断的但我对于进程是未知的 比如我在虚拟桌面里打开A 而A会打开B和C 它们都存在于虚拟桌面里这些都是未知的 我是想过有什么可以通过枚举进程的结构来获取 但太菜了 不懂 未知的话就考虑在TStartupInfo上找出突破口吧,别谦虚了,菜鸟一般不会研究这样问题的。 我看你就是最大的菜鸟,不是我说看看你的回帖哪个有什么含量,都是冲着分来的,你这样的菜鸟不会就不要误人子弟。function GetParentProcessId(const hProcessId: THandle): DWORD; //获取指定进程的父进程PIDtype 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就知道是否运行于虚拟桌面上。 对,我是冲着分来的。这又有什么不可?我没说我是高手啊。既然是区分运行于指定的区域桌面,创建时记录起来就OK了。你所说的方法行不同,因为如果用户切入虚拟桌面后用鼠标双击某个exe启动后,该exe的父进程仍然是explorer.exe 不知道你们怎么想的,假设A是你的虚拟桌面,那么当A打开B ,然后B再打开C,这时候C的父进程就是B,B的父进程就是A,要知道C是不是A的子进程只需要一直递归到最顶层父类的Pid就知道是否是你的虚拟桌面A了。另外对于你的混乱思维直接懒得回你。 虽然不欣赏mwy654321一贯的作风,我测试在虚拟桌面打开进程,新进程的父进程ID还是 explorer.exe的进程ID,和正常桌面explorer.exe的ID一样 我这里测试是用True Launch Bar 一个快速启动桌面 查看是可以的,关键看他虚拟桌面怎么创建进程的 知道鼠标双击创建的细节么?压根你就不知道,鼠标在桌面双击创建本质是explorer.exe这个进程CreateProcess的子进程,说了你也不明白。 鼠标双击当然是explorer.exe进程创建,使用过“超级巡警”杀毒软件的人都知道,在启动任意exe时都会提示进程的来源(父进程)。说了我也不明白?父进程这个很简单吧。我看是你在回避问题的漏洞吧。判断父进程根本行不通,因为进程的创建方式是各种各样,如果有漏洞的方法都不可取。 用tlhelp32的函数,获取进程的线程然后用GetThreadDesktop获取线程所在的desktop 征集北京有多少家公司出差不给补助? 时钟。 当场给分!!!!!!!! 我想做这样的效果,当鼠标点击屏幕就记录下当前的坐标,高手请帮忙 初学者的问题???? 问:怎样取得IE存放网页的临时文件夹的路径? 如何获得与文件类型相关的应用程序? 请大家帮帮忙!! Delphi 怎么识别图片里面的数字。 Listbox中的itemsindex的调用问题 怎样建立动态数组并在使用后释放! Delphi中borderstyle 为bsnone 的窗口怎么实现最大化而不是全屏? 剩下的也散了
还有一种方法应该是想办法取得每个进程的TStartupInfo信息,然后判断它的.lpDesktop来区别。
这么难的问题亏你才给这一点分,我就给你些友情提示吧,希望对你有所帮助!
但我对于进程是未知的 比如我在虚拟桌面里打开A 而A会打开B和C 它们都存在于虚拟桌面里
这些都是未知的 我是想过有什么可以通过枚举进程的结构来获取 但太菜了 不懂
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就知道是否运行于虚拟桌面上。
既然是区分运行于指定的区域桌面,创建时记录起来就OK了。你所说的方法行不同,因为如果用户切入虚拟桌面后用鼠标双击某个exe启动后,该exe的父进程仍然是explorer.exe
不知道你们怎么想的,假设A是你的虚拟桌面,那么当A打开B ,然后B再打开C,这时候C的父进程就是B,B的父进程就是A,要知道C是不是A的子进程只需要一直递归到最顶层父类的Pid就知道是否是你的虚拟桌面A了。另外对于你的混乱思维直接懒得回你。
我测试在虚拟桌面打开进程,新进程的父进程ID还是 explorer.exe的进程ID,和正常桌面explorer.exe的ID一样
鼠标双击当然是explorer.exe进程创建,使用过“超级巡警”杀毒软件的人都知道,在启动任意exe时都会提示进程的来源(父进程)。说了我也不明白?父进程这个很简单吧。我看是你在回避问题的漏洞吧。判断父进程根本行不通,因为进程的创建方式是各种各样,如果有漏洞的方法都不可取。
然后用GetThreadDesktop获取线程所在的desktop