VC实现A进程窗口嵌入到B进程窗口中显示的方法

这篇文章主要介绍了VC实现A进程窗口嵌入到B进程窗口中显示的方法,对于理解windows程序运行原理的进程问题有一定的帮助,需要的朋友可以参考下

本文通过一个Demo示例讲述把A应用程序嵌入到B应用程序中显示的方法。

主要代码如下:

<span style="font-size:12px;font-weight: normal;">//在B应用启动时创建A进程
CreateProcess(_T("A.exe"),NULL,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,NULL,NULL);
Sleep(30);
HWND hWndChild = FindWindow(_T("AAA"),_T("AAA"));
while(!hWndChild)
{
  hWndChild = FindWindow(_T("AAA"),_T("AAA"));
}
//移动A进程窗口位置
MoveWindow(hWndChild,80,20,240,320,TRUE);
//A进程窗口嵌入B进程窗口中
SetParent(hWndChild,hWnd);</span>

An application can use the SetParent function to set the parent window of a pop-up, overlapped, or child window. The new parent window and the child window must belong to the same application。

这是从msdn里面对SetParent的使用描述,说SetParent要嵌入的窗口必须和被嵌入的窗口属于同一个应用程序,其实不然,不过SetParent返回的确实是一个Null,这是因为A进程中的窗口并不存在父窗口,而SetParent调用后会返回父窗口的句柄,故返回Null。但是却不会影响A进程窗口嵌入。

在B进程窗口显示时收到的WM_ACTIVE中先会收到WA_ACTIVE或者WA_CLICKACTIVE,然后也会收到WA_INACTIVE参数,也就是说在某个时候,B进程没有被置为最前窗口,这应该是当调用SetParent时,影响了B进程窗口。如果你希望B进程窗口收到WM_ACTIVE消息,必须调用SetForegroundWindow(hWnd),如果当前窗口不是最前窗口时,退出或者最小化时不会收到WM_ACTIVE消息中的WA_INACTIVE。尤其做嵌套应用程序的代码中,应该牢记于心。

除此以外,当使用SetParent(hWndChild,hWnd)把A进程到B进程窗口中时,这时使用FindWindow查询到A进程的窗口句柄为null。

时间: 2024-12-24 21:36:56

VC实现A进程窗口嵌入到B进程窗口中显示的方法的相关文章

在Android 窗口小组件(Widget)中显示(StackView,ListView,GridView)集合View

在Android 3.0 中引入了 Collection View Widget.用于在窗口小组件中添加了对集合View 的支持. 如下: (1)StackView 一个卡片View,以层叠的方式显示其子View. (2)ListView 和传统的ListView一样 (3)GridView 网格列表.具体用法和传统的一样. 第一步:创建Widget布局文件    (1)Wdiget的布局文件 路径:res/layout/my_widget_layout.xml <?xml version=&quo

窗口嵌入到另一个窗口(VC和QT都有)

1.用vc新建一个dialog1工程.属性默认. 2.insert一个dialog2,改为child. 3.在dialog1中包含dialog2头文件,在一个按钮事件中显示dialog2: Cdialog2 *p = new Cdialog2(this); p->Create(IDD_Dialog2); p->SetParent(this);//设置dialog1为父窗口 p->ShowWindow(SW_SHOW); 这样,dialog2便嵌到dialog1了,比用tabcontrol

Qt实现嵌入桌面的半透明窗口

这儿用上了前面一文提到的函数findDesktopIconWnd().见: http://mypyg.blog.51cto.com/820446/263349 一.将Qt窗口嵌入到桌面中.声明一个最简单的类: class Dialog : public QDialog{        Q_OBJECTpublic:        Dialog(QWidget *parent = 0);        ~Dialog();} 函数实现: Dialog::Dialog(QWidget *parent

(转)source insight 窗口嵌入

昨天用了一下source insight ,都说很强大,也有感觉,但是这个强大的东西往往不是那么容易弄清楚的,或者一下子就好上手的,工具强大,功能复杂多样,一开始不知道怎么入手,以后慢慢来吧,学习是要与时俱进的. 昨天自己乱弄不小心把嵌入的窗口独立出来了,这下就麻烦了,其实以前windows里面很多IDE都是这样的,但是windows里面的那些窗口很容易弄回去,再不然你还可以恢复默认窗口样式,但是source insight就没有回到默认啦,我没有发现啦,要是有人知道不吝赐教啊,昨天为了这事纠结

VC/MFC程序开启关闭其他软件,更改窗口类

流程: 1. 获取目标程序的  窗口HWND hWnd HWND hWnd = ::FindWindowA(_T("SoftWareClassName"),NULL); //获取需要软件的窗口 2. int ret = ::SendMessageA(hWnd ,WM_CLOSE,0,0); //关闭软件 3. WinExec(D:\\Foxit Reader.exe,SW_SHOWMAXIMIZED);  //开启软件 关于FindWindow()有两个参数  第一个是窗口类名,第二个

对《将Unreal4打包后的工程嵌入到Qt或者桌面中》一文的补充

在上一文中本人尝试将Ue4嵌入到Qt中,但依然有一些问题没有去尝试解决.今天因为帮助知乎专栏作者@大钊的关系,顺便进行补完 已知的坑 1.因为启动的exe进程并非游戏进程,所以通过QProcess的状态来判断Ue4是否启动是不对的,推荐使用WINAPI来获取对应线程. 2.可以在项目设置中修改窗口显示标题,可以把讨厌的(32-bit, PCD3D_SM5)去掉,强烈推荐使用窗口句柄查看工具,我是网上下了句柄精灵.(窗口标题后面都是有空格的) 嵌入Qt后,UE4无法接受键盘鼠标输入 使用 以下函数

FineUI小技巧(5)向子窗口传值,向父窗口传值(另附24张专业版高清大图)

前言 FineUI中经常会用到启用IFrame的Window控件,这样有助于从物理上进行代码解耦和.IFrame的引入就会涉及传值问题,如何在父窗口和子窗口之间相互传值呢? 向子窗口传值 向子窗口传值只需要把要传递的参数放在页面URL中即可,一般有两种做法: 页面回发,在后台通过C#代码拼接需要的URL(推荐做法,方便!) 页面第一次加载时,即注册需要的URL(如果参数是页面上某输入框的值,则需要在URL中嵌入JavaScript代码) 来看一个例子,分别用上述两种方式实现: 页面的初始显示 点

Win7怎么关闭多余进程,怎么关闭无法关闭进程

我们使用电脑的时候,有时候会发现电脑的速度突然变慢了,这时候我们可以查看下自己电脑的进程,看看有没有非常占用CPU的无关进程在使用,这时候我们可以关闭一些占用CPU系统资源比较多的无用进程,但是提醒大家关闭进程大家一定要谨慎操作,否则会导致电脑上一些程序或应用就无法使用哦,可能还有些时候大家发现为啥有些进程无法关闭呢?总是提示无法中止进程,怎么办呢?其实我们不需要使用第三方工具,我们使用电脑的一些DOS命令或者电脑操作就可以进行关闭,这里小编给大家介绍下关闭系统进程的操作方法.希望大家需要时可以

2进程之间的关系:进程组,会话,守护进程

 1进程组 一个或过个进程的集合,进程组ID是一个正整数.用来获得当前进程组ID的函数. pid_t getpgid(pid_t pid) pid_t getpgrp(void) 获得父子进程进程组 运行结果: 组长进程标识:其进程组ID=其进程ID 组长进程可以创建一个进程组,创建该进程组中的进程,然后终止,只要进程组中有一个进程存在,进程组就存在,与组长进程是否终止无关. 进程组生存期:进程组创建到最后一个进程离开(终止或转移到另一个进程组) 一个进程可以为自己或子进程设置进程组ID i