如何获取系统进程中的应用进程?

秋天之落叶 2018-07-24 10:45:28
我想在打开某一软件之前关掉应用进程,如何获得?
我只想要应用进程,而不是系统进程:

如上图,我只想要应用里面的进程。网上的是遍历所有的进程,应用进程可能几个,不可预测,不能指定的。
如何获取?
...全文
740 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
BlueStorm 2018-10-10
  • 打赏
  • 举报
回复
(1)所需的判断条件,可以根据自己的需要来增减。 (2)不需要判断的进程,自己把它忽略就可以了
秋天之落叶 2018-09-29
  • 打赏
  • 举报
回复
有一点不明,就是这几个条件必须同时满足吗?
if (GetWindowText(hWnd, Capt, 255) <> 0) and IsWindowVisible(hWnd) and (not IsIconic(WND)) and IsWindowEnabled(hWnd) then
秋天之落叶 2018-09-29
  • 打赏
  • 举报
回复
因为有几个判断的还不是太准确:
ApplicationFrameHost.exe
explorer.exe
MicrosoftEdge.exe
MicrosoftEdgeCP.exe
win10下这几个也判断为应用进程了,而自带的任务管理器剔除了。
秋天之落叶 2018-09-29
  • 打赏
  • 举报
回复
引用 21 楼 BlueStorm 的回复:
应用和后台程序的区别,应该就是前者有窗体而后者没有吧。
可以通过用ProcessID查找窗体的Handle,如果能找到,就确定是前台应用程序,否则就是后台程序。


function GetHWndByPID(const hPID: THandle): THandle;
var
PID: DWORD;
hWnd: THandle;
Capt: array[0..255] of Char;
begin
Result := 0;
if hPID = 0 then Exit;

hWnd := FindWindow(nil, nil);
while (hWnd <> 0) do
begin
if (GetWindowText(hWnd, Capt, 255) <> 0) and
IsWindowVisible(hWnd) and // (not IsIconic(WND)) //这里的条件根据需要来调整。
IsWindowEnabled(hWnd) then
begin
GetWindowThreadProcessID(hWnd, @PID);
if (PID = hPID) then
begin
Result := hWnd;
Exit;
end;
end;
hWnd := GetWindow(hWnd, GW_HWNDNEXT);
end;
end;

基本满足,结贴
BlueStorm 2018-09-21
  • 打赏
  • 举报
回复
应用和后台程序的区别,应该就是前者有窗体而后者没有吧。 可以通过用ProcessID查找窗体的Handle,如果能找到,就确定是前台应用程序,否则就是后台程序。


function GetHWndByPID(const hPID: THandle): THandle;
var
  PID: DWORD;
  hWnd: THandle;
  Capt: array[0..255] of Char;
begin
  Result := 0;
  if hPID = 0 then Exit;

  hWnd := FindWindow(nil, nil);
  while (hWnd <> 0) do
  begin
    if (GetWindowText(hWnd, Capt, 255) <> 0) and
       IsWindowVisible(hWnd) and  // (not IsIconic(WND))  //这里的条件根据需要来调整。
       IsWindowEnabled(hWnd) then
    begin
      GetWindowThreadProcessID(hWnd, @PID);
      if (PID = hPID) then
      begin
        Result := hWnd;
        Exit;
      end;
    end;
    hWnd := GetWindow(hWnd, GW_HWNDNEXT);
  end;
end;
秋天之落叶 2018-09-14
  • 打赏
  • 举报
回复
还有提供参考的兄弟吗?呵呵
秋天之落叶 2018-08-15
  • 打赏
  • 举报
回复
引用 17 楼 running987 的回复:
http://www.jiyuew.top/article/14839

这个地方找了很久,没看到什么有用的东西?
  • 打赏
  • 举报
回复
他是自我炒作~~~

秋天之落叶 2018-07-27
  • 打赏
  • 举报
回复
显示的是 应用程序-任务,难道是任务栏可以获取信息?
秋天之落叶 2018-07-27
  • 打赏
  • 举报
回复

即使取得了用户名,感觉还是不能达到目的,因为不是所用的用户下的进程都可以杀死的。
如何判断用户进程,抓瞎啊。
微软是如何判断的呢?请高手继续指点。
秋天之落叶 2018-07-27
  • 打赏
  • 举报
回复
引用 13 楼 BlueStorm 的回复:
WTSEnumerateProcessesA改为WTSEnumerateProcessesW

果然
我新找了一段代码,感觉基本可行,回头报告
BlueStorm 2018-07-26
  • 打赏
  • 举报
回复
WTSEnumerateProcessesA改为WTSEnumerateProcessesW
秋天之落叶 2018-07-26
  • 打赏
  • 举报
回复
不过进程名对我来说可用可不用,我先去研究一下 WTS_PROCESS_INFO.pUserSid吧。
多谢楼上高手。
秋天之落叶 2018-07-26
  • 打赏
  • 举报
回复
引用 10 楼 DelphiGuy 的回复:
hToken: Cardinal; 改成 hToken: THandle;

哈哈,果然能运行了,不过,显示的是乱码,好像LPTSTR转换的问题,但是网上查不到D的解决方法。
  • 打赏
  • 举报
回复
hToken: Cardinal; 改成 hToken: THandle;

秋天之落叶 2018-07-26
  • 打赏
  • 举报
回复
自己写的内部考试软件,已经屏蔽了退出快捷键、隐藏了任务栏,只能提交试卷退出。
寻找用户进程的目的是为了进入考试的时候,直接关闭各自计算机上的Word文档、excel表格、文本文件、PDF文件、图片文件等可以抄袭的应用。
不知道delphi写的应用正常显示和缩小到任务栏或托盘有没有状态,如果有能检测到也行。
反正目的就是为了防止作弊,因为都是自己的计算机。
以前见过一个教育软件,可以直接将被培训人员的计算机锁屏的,效果不是太好,但起码可以控制不太熟悉计算机的人。
一般代码我还可以应付,涉及系统操作或太深的我基本抓瞎。
秋天之落叶 2018-07-26
  • 打赏
  • 举报
回复
我贴的这个起码我能看懂点,想直接套用,但是
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken); ////这里提示错误 Types of actual and formal var parameters must be identical
不知道为什么?
秋天之落叶 2018-07-26
  • 打赏
  • 举报
回复
引用 6 楼 BlueStorm 的回复:
https://stackoverflow.com/questions/40674193/how-to-check-if-a-process-belongs-to-the-current-user

说实话,一脸懵逼的进去一脸懵逼的出来,看不懂啊
BlueStorm 2018-07-25
  • 打赏
  • 举报
回复
https://stackoverflow.com/questions/40674193/how-to-check-if-a-process-belongs-to-the-current-user
秋天之落叶 2018-07-25
  • 打赏
  • 举报
回复
https://download.csdn.net/download/dwpii/2784279
https://bbs.csdn.net/topics/290022438
加载更多回复(4)

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧