如何获取外部EXE窗口的handle

C++ Windows服务程序打开及关闭外部 .exe程序 在开发看门狗服务程序拉起外部有UI 界面的程序的过程中,虽然系统显示程序已经在运行且能查到有进程,但是界面并没有显示;无论是用shellExecute 还是CreateProcess 都不行。 后面通过网上资料知道因为服务程序在Windows 中处于session0 的区域,而一般的桌面程序是在session1,2,3…中,若要想把界面显示出来,我们需要做权限击穿来模拟用户启动程序。简单的来说,就... 阅读详情

这是我在一个论坛的讨论稿,我想这些情况在实践程序设计过程中会常碰到,所以就将这些讨论资料写了下来:

作者:e梦缘

?

请问用什么方法可以运行一个外部的EXE并返回它的Handle?
WinExec 返回不是该EXE的Handle
ShellExecute, ShellExecuteEx 也不是
CreateProcess 返回的是 Process Handle
到底要如何才可以返回和 GetWindow 所返回的一样的 Handle?

Re:

可以用FindWindow()函数,它能够解决这个问题,它有两个参数:lpClassName:程序的类名;lpWindowName:程序窗体的标题。

例如:

procedure TForm1.Button1Click(Sender: TObject);
begin
ShellExecute(handle,'open','notepad.exe',nil,nil,SW_ShowNormal);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
ExeHandle:Thandle;
Begin
//获得句柄
ExeHandle:=FindWindow('notepad',nil);//'');//返回句柄
//关闭程序
if ExeHandle<>0 then
SendMessage(ExeHandle,WM_Close,0,0)
Else
Application.MessageBox('没有打开"记事本"程序!','提示',
MB_IconInformation+MB_OK);
end;

?
FindWindow() 方法不是我想要的,因为这里的lpWindowName 具有不确定性,没有办法准确地找到。
我希望能在执行这支外部程序里就可以得到它的 Handle.
比如有没有办法,通过Process Handle得到它有
Application Handle 以及 MainForm Handle

Re:

您可以通过lpClassName:程序的类名来准确地找到。

ExeHandle:=FindWindow('notepad',nil);//返回句柄

移至頂端function ExecuteFile(const FileName, Params, DefaultDir: String;

ShowCmd: Integer): THandle;

var

zFileName, zParams, zDir: array[0..79] of Char;

begin

Result := ShellExecute(Application.MainForm.Handle, nil,

StrPCopy(zFileName, FileName), StrPCopy(zParams, Params),

StrPCopy(zDir, DefaultDir), ShowCmd);

end;

procedure TForm1.Button3Click(Sender: TObject);
var
hwd:thandle;
begin

hwd:=ExecuteFile('notepad.exe','','',SW_ShowNormal);
if hwd<>0 then showmessage('哈哈~~'+#13+'我取到handle了,是>>>'+inttostr(hwd));

end;

 

?

谢谢您的热心帮助,
但ShellExecute得到的并不是Handle
用FindWindow得到的才是真正的Handle
你可以试一下.
最简单的方法就是向你得到的Handle发一个WM_QUIT消息,看它是否会被关闭.
如:
SendMessage(AHandle, WM_QUIT, 0, 0);

 

Re:

我看了很多delphi的资料,好像只有FindWindow()函数是 可以实现的,至于是否还有其它的方法,我 不太清楚!

 

最后结果:

我已从大富翁论坛上得到了满意的结论了,在这和大家分享一下:
(大富翁论坛: http://www.delphibbs.com/)

type
PEnumInfo = ^TEnumInfo;
TEnumInfo = record
ProcessID : DWORD;
HWND : THandle;
end;

function EnumWindowsProc(Wnd: DWORD; var EI: TEnumInfo): Bool; stdcall;
var
PID : DWORD;
begin
GetWindowThreadProcessID(Wnd, @PID);
Result := (PID <> EI.ProcessID) or
(not IsWindowVisible(WND)) or
(not IsWindowEnabled(WND));

if not result then EI.HWND := WND;
end;

function FindMainWindow(PID: DWORD): DWORD;
var
EI : TEnumInfo;
begin
EI.ProcessID := PID;
EI.HWND := 0;
EnumWindows(@EnumWindowsProc, Integer(@EI));
Result := EI.HWND;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
SI : TStartupInfo;
PI : TProcessInformation;
H : THandle;
S : String;
begin
ZeroMemory(@SI, SizeOf(SI));
ZeroMemory(@PI, SizeOf(PI));
SI.cb := SizeOf(SI);
if CreateProcess(nil,'CALC.EXE', nil, nil, FALSE, 0 ,nil,nil, SI, PI) then
begin
//注意!
WaitForInputIdle(PI.hProcess, INFINITE);

H := FindMainWindow(PI.dwProcessID);
if H > 0 then
begin
SetLength(S, 255);
GetWindowText(H, PChar(S), 255);
SetLength(S, StrLen(PChar(S)));
ShowMessage(S);
end;

CloseHandle(PI.hProcess);
CloseHandle(PI.hThread);
end;
end;
end.

 

内嵌第三方EXE程序窗口 最近有个开发任务,将一个exe程序内嵌至另一个exe窗口中执行, 阅读详情

相关推荐

外部exe程序启动CAD并且自动加载CAD的ARX程序的过程

程序名:MFCOpenCADWithARX.exe 版本:1.0 时间:15.11.2 ***************************************************** 首先感谢 @七彩云南,在网上查找资料的时候发现了他的资料,很是详细,但是没有找到文章的出处。 我的程序没有他的复杂。 *************************************

fudong071234的博客 1万+

Windows进程管理小工具Handle:用于解决未知程序占用文件问题(Windows10系统)

场景:在我们卸载程序时,常常有些残留文件保留在安装路径下,我们进入目录进一步做删除清理时,发现文件被占用,却不知道什么进程占用,接着我们就可利用微软公司提供的这么一款工具来解决我们的问题。 下载地址: https://docs.microsoft.com/zh-cn/sysinternals/downloads/handle 解压文件后打开是这样: 以第一个文本文件是软件相关协议的声明,han...

weixin_42124234的博客 1万+

QProcess :: startDetached在启动cmd.exe外部程序没有弹出窗口

不放自己的工程了,找到一个官网测试的案例。目前反应的是5.7.1可以使用,5.8以后,5.12等版本反应不再支持弹出窗口 #include <QApplication> #include <QProcess> #include <QPushButton> void startProcess() { QProcess p; p.startDetached("C:\\WINDOWS\\system32\\cmd.exe", .

xinqingwuji的博客 5359

win10 vbs调用handle.exe handle64.exe killhandle以D2R为例

需要把handle64.exe放入系统盘的Windows\System32文件夹,如C:\Windows\System32。代码目标:杀掉暗黑2R的多开验证handle (DiabloII Check For Other Instances)32位系统则调用handle.exe ,代码做相迎修改即可。资料来源:凯恩之角,原出处不详。环境:win10 64位。

weixin_44715212的博客 1322

《Sysinternals实战指南》进程和诊断工具学习笔记(8.22):Handle——是谁在占用这个文件,不让我删?

这一篇我们来看 Sysinternals 家族里,现场排障频率极高的神器之一:Handle.exe。这个工具干的事情非常直接,也非常关键:翻译成人类语言:这些问题,靠图形界面你往往拿不到答案。而 Handle 可以。Handle.exe 是 Sysinternals 提供的内核句柄(handle)枚举工具。它会列出系统当前所有打开的句柄,包括但不限于:并支持按“进程→句柄列表”或直接按“资源名称”搜索,还可以尝试关闭指定句柄。所以当 Windows 提示你:下面这些场景,Handle 真的几乎是唯一有效的办

分享 Windows 系统部署、镜像封装、终端管理、故障排查与运维自动化实践,涵盖 Sysinternals、PowerShell 和 AI 工具应用。以真实案例梳理排查思路与解决步骤,让运维经验清晰、可复用。 2万+

《Sysinternals实战指南》进程和诊断工具学习笔记(8.27):Handle——谁占用了这个文件?句柄枚举、搜索与强制释放

下一篇,我们会进入“把这些工具接入日常排障流程”,也就是把这些操作从临时应急,升级成公司级 SOP / 维护手册的思路。)时,内核会给它一个“句柄(handle)”它是清日志、替换 DLL、解锁共享文件、强行下线卡死服务的最后一段路,也是做现场 forensics(取证)时非常关键的证据来源。到这一步,基于第 8 章的 Sysinternals 整套“进程 & 诊断”工具线基本都已经在你手里了:。这会列出该进程打开的文件、管道、注册表键、同步对象等,能帮你观察它当前在做什么,比如:。

分享 Windows 系统部署、镜像封装、终端管理、故障排查与运维自动化实践,涵盖 Sysinternals、PowerShell 和 AI 工具应用。以真实案例梳理排查思路与解决步骤,让运维经验清晰、可复用。 2万+

MFC中嵌入外部独立EXE程序

在股票期货量化交易过程中,交易工具、策略部分可能只会完成自身所关注逻辑部分,而不是一整套完整的图表系统。,若都需要自己去完成工作量太大了。但是某些场景下我有需要展示图表比如k线等数据。本文介绍一种基于MFC嵌套外部EXE方案实现。上面2个方案各有优缺点,方案一只需要指定被嵌套的exe路径就可以完成嵌套操作,但是不能对于多窗口切换导致句柄变化方案一却不能满足,方案二只需要指定主要嵌套exe的名称,但是这个需要我们手工的启动程序。当然我们可以结合方案1和方案二优缺点进行改造。

秋天的落雨的博客 877

MFC实现嵌入第三方exe程序到窗口中

实现打开外部程序的函数。

m0_60352504的博客 3255

Windows Spy++ 与 Qt 5.15:精准获取外部EXE窗口类名的2种方法与1个自动化脚本

本文详细介绍了在Qt 5.15中精准获取外部EXE窗口类名的两种方法:使用Spy++工具手动获取和通过EnumWindows API自动化遍历窗口。文章还提供了一个经过实战验证的Qt工具函数封装方案,帮助开发者高效解决窗口嵌入问题,特别适用于需要集成第三方应用的开发场景。

weixin_28836989的博客 255

【句柄小助手】Handle

Handle(句柄小助手)是一款绿色免费的窗口句柄获取工具,该软件可以获取到指定窗口及与其相关窗口的句柄信息,这其中包括了窗口句柄、窗口关系、窗口类名、标题、进程名称、进程ID、路径、大小和状态,还可以修改标题,并对进程进行管理,需要的朋友欢迎前来下载使用!

handle.exe

查看win10下指定进程的句柄、PID、Mutant、操作详情等信息。例如查看钉钉,handle.exe -a DingTalk 。 可在CMD中使用handle.exe /?获取详细帮助文档。

C# winform winApi 根据传入handle 句柄获取 其它窗口,如:使用中的子窗口、同级窗口等。

//根据传入的窗口句柄,获取到同级、顶级、低级的窗口,根据GetWindowCmd 传入的不同获取也不同,详细看GetWindowCmd 类说明 [DllImport("user32.dll", SetLastError = true)] static extern IntPtr GetWindow(IntPtr hWnd, GetWindowCmd uCmd); private v...

一叶千秋 7424

handle.exe压缩包

windows解除文件占用工具,可列出当前所有进程,并可查询指定文件被占用情况,使用方式参考https://www.cnblogs.com/arxive/p/7011568.html

Windows下获取窗口列表,会过滤一些无效窗口

#include <Windows.h> #include <iostream> #include <vector> #include <string> #include <dwmapi.h> #include <olectl.h> #include <psapi.h> #include <wingdi.h> #include <chrono> #include <thread> co.

yp18792574062的博客 1907

AJ-Report开源数据大屏存在远程命令执行漏洞

该平台可以通过post方式在validationRules参数对应值中进行命令执行,可以获得服务器权限,登陆管理后台接管大屏。如果被攻击者利用,危害后果十分严重。

swordheart的博客 387

基于STM32F103C8T6的红外循迹避障小车

编程思路:控制核心板IO口的电平(即电机驱动模块的AIN1,AIN2,BIN1,BIN2)从而控制AO1、AO2、BO1、BO2的电平高低,进而控制电机使其正转、反转、不转。由于单纯地拉高拉低电平只能让电机在转与不转的状态切换,故决定利用TIM4的两个通道分别产生两路PWM信号来控制电机速度,四个电机两个一组,同一侧的两个连接在同一个PWM上。(#include "dianji.h"文件中同时写了对循迹模块引脚的初始化)

weixin_48743503的博客 1万+

MFC窗体中打开第三方exe程序到指定区域(一)

https://blog.youkuaiyun.com/tfygg/article/details/51174801 流程如下: 1、CreateProcess创建外部EXE进程 2、获取指定区域的坐标 3、查找进程的主窗口 4、将外部程序移到指定区域 5、调用ShowWindow显示窗口 主程序如下: handle=StartProcess("D:\\program tool\\Secu...

bmjhappy的专栏 2931

告别黑窗口:XShell+X11转发图形化界面的5分钟保姆级教程(附Xming配置)

本文详细介绍了如何使用XShell和X11转发技术快速实现Linux图形化界面的远程访问。通过5分钟快速配置指南,包括服务端设置、客户端工具选择及XShell+Xming的完美配置,帮助用户高效运行GUI应用程序,提升远程工作效率。特别适合需要图形化操作的开发者和运维人员。

weixin_29223603的博客 326

windows下调用外部exe程序 SHELLEXECUTEINFO

本文主要介绍两种在windows下调用外部exe程序的方法:

bigbigtree 1761

Shell编程规范及变量

文章目录一.Shell脚本1.1Shell概述1.2Shell脚本 一.Shell脚本 1.1Shell概述 Shell是Linux系统中开机自动加载的一个特殊程序,它将用户输入的指令,转换成Linux内核可以识别的语言,从而让内核执行调用硬件。 Bash是Linux系统中默认使用shell的程序,它位于/bin/bash。 1.2Shell脚本 将需要执行的命令保存到一个文件中,按照顺序执行,它不需要编译,它是解释型的 ...

夏颜的博客 3674

PSM-DID实战指南:Stata代码解析与案例应用

本文详细解析PSM-DID方法在Stata中的实战应用,从理论到代码实现全面覆盖。通过倾向得分匹配(PSM)和双重差分(DID)的结合,有效解决政策评估中的选择偏差问题。文章提供完整的Stata命令代码、样例数据处理技巧和案例应用,帮助研究者准确评估政策效果。

vulkan6gpu的博客 791

浏览器多窗口切换:句柄(handle值)_xing2516_新浪博客

##浏览器多窗口切换:句柄(handle值)from selenium import webdriver import time driver=webdriver.Chrome(executable_path="../chromedriver.exe") driver.get('https://www.hao123.com/') time.sleep(2) #获取当前网页的句柄(ha...

1217

PCL 最小生成树用于法向量定向【2025最新版】

PCL 最小代价生成树用于点云法向量的定向。博客长期更新,本文最近更新时间为:2025年9月15日。

点云侠的博客 2067
上一篇: 超强存储过程!原作,版权所有!精悍!!!
下一篇: 程序间参数传递 Copydata
libra01
博客等级 码龄26年 0粉丝 41原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值