社区
进程/线程/DLL
帖子详情
MFC 如何通过子进程句柄获取子窗口句柄
一只小水鱼
2013-09-30 03:04:52
如题。
我在MFC中用CreateProcess启动一个外部程序,这个程序是写好的、无法修改的
我现在想用SendMessage()的方式给这个外部程序发送WM_CLOSE信号,
但是这个函数需要有外部程序的窗口句柄。
我只有从CreateProcess函数取得的外部程序的进程句柄,
我要怎么样才能获得外部程序的窗口句柄?
我知道要用FindWindowEx()函数,但是函数参数该怎么填?
...全文
515
6
打赏
收藏
MFC 如何通过子进程句柄获取子窗口句柄
如题。 我在MFC中用CreateProcess启动一个外部程序,这个程序是写好的、无法修改的 我现在想用SendMessage()的方式给这个外部程序发送WM_CLOSE信号, 但是这个函数需要有外部程序的窗口句柄。 我只有从CreateProcess函数取得的外部程序的进程句柄, 我要怎么样才能获得外部程序的窗口句柄? 我知道要用FindWindowEx()函数,但是函数参数该怎么填?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
encoderlee
2013-09-30
打赏
举报
回复
另外CreateProcess好像返回目标线程ID吧,那样就可以直接对该ID调用EnumThreadWindows
encoderlee
2013-09-30
打赏
举报
回复
你用VC自带的SPY++工具就能看到外部程序的窗口标题和窗口类名了
真相重于对错
2013-09-30
打赏
举报
回复
通过进程id获取窗口
一只小水鱼
2013-09-30
打赏
举报
回复
引用 1 楼 VisualEleven 的回复:
FindWindow(NULL,_T("xxx")); // 第二个参数传递想要找的窗口个标题
问题是 窗口标题在哪里找? 我那个是外部程序,网上下载的,窗口标题怎么获取?
Eleven
2013-09-30
打赏
举报
回复
也可以EnumWindows枚举窗口得到HWND,利用GetWindowThreadProcessId得到进程的ID,然后与你PROCESS_INFORMATION中pi的ID相对比,相等即找到了。
Eleven
2013-09-30
打赏
举报
回复
FindWindow(NULL,_T("xxx")); // 第二个参数传递想要找的窗口个标题
MFC
根据进程ID
获取
窗口
信息
MFC
C++ Windows 通过
获取
到的进程ID,进而
获取
所对应的
窗口
信息,从而对
获取
的
窗口
进行操作 (内含控制其它win程序按钮的示例)
VC进程ID获得主
窗口
句柄
获得进程名
VC获得进程ID获得主线程ID获得
窗口
句柄
获得主
窗口
获得进程名 1.
窗口
类名
窗口
句柄
窗口
标题
窗口
句柄
HWND FindWindow( LPCTSTR lpClassName, //
窗口
类名 可用 VC或者VS自带的Spy++查看 LPCTSTR lpWindowName //
窗口
标题 ); 举例: 以 记事本为例, 记事本
窗口
类名 为:NotePad,
窗口
标题 视按具体情况而定,假设为"新建 文本文档.txt - 记事本"
窗口
类名
窗口
句柄
TCHAR lpClassName[]=TEXT("NotePad"); HWND hWnd=::FindWindow(lpClassName,NULL); if(hWnd && IsWindow(hWnd)) ::ShowWindow(hWnd,SW_HIDE);
窗口
标题
窗口
句柄
TCHAR lpWindowName[]=TEXT("新建 文本文档.txt - 记事本"); HWND hWnd=::FindWindow(NULL,lpWindowName); if(hWnd && IsWindow(hWnd)) ::ShowWindow(hWnd,SW_HIDE); 2.
窗口
句柄
进程ID
窗口
句柄
主线程ID 要使用到的函数: DWORD GetWindowThreadProcessId( HWND hWnd, //目标
窗口
句柄
LPDWORD lpdwProcessId //返回目标
窗口
对应进程ID ); 例
子
: DWORD dwProcId=0;//存放返回的进程ID DWORD dwThreadId=0;//存放返回的主线程ID HWND hWnd=XXXX;//这里省略,可能用任务方式得到一个
窗口
的
句柄
.比如用1中的方法. dwThreadId=GetWindowThreadProcessId(hWnd,&dwProcId);//同时得到进程ID和主线程ID. 3.
窗口
HAND CWnd 用CWnd::FromHandle(HWND hWnd)函数.很多类都有这个函数. 4.进程名 进程ID (注:进程名,即在"任务管理器"中看到的名字) 用CCheckObject类(详细实现源文件); 例
子
: 以记事本为例,进程名为 NOTEPAD.EXE (不一定是大写哦,得到任务管理器是显示而定); CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); DWORD dwProcId=ch.GetProcessId(Name); 5. 进程名 主线程ID 例
子
: CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); DWORD dwThreadId=ch.GetThreadId(Name); 6. 进程名 主
窗口
句柄
CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); HWND hWnd=ch.GetTargetWindowHanle(Name); 7. 其它说明 从CCheckObject类和上面的源码中,不难写出从 进程ID 主线程ID 进程ID 主
窗口
句柄
主线程ID--->主
窗口
句柄
等等其它类似转换. 对于主
窗口
,特点如下: A. 不能用进程ID,要用线程ID,因为一个进程可能有多个线程,每个线程都可能会有主
窗口
. B. 主
窗口
不会有WS_CHILD属性 C. 主
窗口
没有父
窗口
D. 主
窗口
一般都有
子
窗口
(这个不是一定的,但是具有普遍性)
基于
MFC
根据
句柄
关闭
窗口
基于
MFC
根据
句柄
来关闭电脑上开着的
窗口
获取
其他进程ID和控件
句柄
1.通过应用程序路径
获取
其他进程ID 2.
获取
其他进程的对话框
句柄
和控件
句柄
里面有实现函数,有什么需求也可以自己改改了。
MFC
内嵌第三方EXE
窗口
VS2010,多Tab
窗口
,内嵌第三方exe记事本(NotePad.exe),其中解决了刷新、移动等问题。
进程/线程/DLL
15,473
社区成员
49,171
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章