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

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

主要代码如下:

//在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);

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。

(0)

相关推荐

  • VC实现对话框窗口任意分割

    个人认为简单问题最好就是直接贴源代码,一看就明白,说来说去反而弄不清楚,那我就少废话了,自己看吧,注释很清楚. 先来张图片 1. 新建一个MFC对话框程序MySplitterDlg. 再插入两个Dialog资源 ,这里一定要选择IDD_FORMVIEW类别的对话框,分别新建类CMyFormView0 和CMyFormView1,基类别选CDialog,一定要选择CFormView. 2. CMySplitterDlg中增加WM_CREATE的消息响应,编辑OnCreate() int CMySp

  • C++之CWnd窗口框架实例

    本文实例讲述了CWnd窗口框架,分享给大家供大家参考.具体分析如下: .h头文件代码如下: 复制代码 代码如下: #include <afxwin.h>    class CMyApp:public CWinApp  {  public:      virtual BOOL InitInstance();  };    //CMainWindow  class CMainWindow:public CWnd  {  public:      CMainWindow();      ~CMain

  • VC++编程获取窗口句柄的方法小结

    本文实例讲述了VC++编程获取窗口句柄的方法.分享给大家供大家参考,具体如下: 在VC++编程中常需获取控件或窗体句柄,下面总结了几种方法,还希望大家能多多补充. 1.自身窗口句柄可用AfxGetMainWnd获取. 2.系统中其他APP的窗口句柄可用FindWindow获取(用SPY帮一下忙). HWND hBtnClose; HWND hWnd=::FindWindow(NULL,"腾讯QQ系统广播"); if(hWnd) { hBtnClose=GetDlgItem(hWnd,2

  • C++ 中CloseHandle 函数--关闭一个句柄

    CloseHandle函数 作用 关闭一个打开的对象句柄. 语法 BOOL WINAPI CloseHandle( _In_ HANDLE hObject ); 参数 hObject 已经打开的有效对象句柄. 返回值 如果函数操作成功,返回值为非零值 如果函数操作失败,返回值为零. 注意: (1)句柄不应该被关闭两次: (2)可以关闭的句柄有控制台输入.控制台屏幕缓冲区等. 头文件 Winbase..h(包括Windows.h) 参考来源:来源:https://msdn.microsoft.co

  • 用VC++6.0的控制台实现2048小游戏的程序

    首先感谢这位大侠的无私分享,仔细学习这个程序以后收获很多,试着添加一些注释 源程序是从开源中国看到的,原作者是 刘地(sir?) 地址为http://www.oschina.net/code/snippet_593413_46040 geek_monkey于2015年3月5日为拜读该程序,受益匪浅 为了方便自己,以及更多初学者阅读,我试着写了写了注释供参考 我是C语言初学者,如有错误希望指正.轻喷 复制代码 代码如下: #include <stdlib.h> #include <stdi

  • VC++实现输出GIF到窗体并显示GIF动画的方法

    本文讲述了VC++在窗体中显示GIF动画的方法,这是主要代码部分,在这段代码中,VC++将使用GDI技术加载GIF图像,定义GUID数组.定义指针.初始化各成员变量.释放属性对象.释放GUID等资源等. 代码如下: //加载GIF文件 void COutputGIFDlg::OnBrowse() { CFileDialog flDlg(TRUE, "", "", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "GIF|*.

  • VC小技巧汇总之窗口技巧

    本文搜集汇总了VC小技巧的窗口技巧,对于VC程序开发的窗口设计而言有一定的借鉴价值,详情如下: 1.让窗口一启动就最大化 把应用程序类(CxxxApp)的 InitInstance() 函数中的 m_pMainWnd->ShowWindow(SW_SHOW); 改为 m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED); 则窗口一启动就最大化显示. 2.如何设置窗口的初始尺寸 在将应用程序类(CxxAPP)的 InitInstance() 函数中加入: m_pMai

  • VC6实现激活后台窗口最佳方法

    本文实例讲述了VC6实现激活后台窗口最佳方法.分享给大家供大家参考.具体实现方法如下: //激活窗口 SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE); SetWindowPos(&wndNoTopMost, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE); HWND hCurWnd = NULL; DWORD lMyID; DWORD lCurID; hCurWnd = ::GetForegro

  • 在VC中隐藏控制台程序窗口的实现代码

    下面就介绍一下,如何隐藏win32 console application的console窗口因为此种方法是通过设置编译器的链接开关来实现,所以让我们来看一下编译器的链接开关选项(也就是linker选项).首先我们来看一下linker的 /subsystem 选项该选项的语法形式如下: /subsystem:{console|efi_application|efi_boot_service_driver|efi_rom|efi_runtime_driver|native|posix|window

  • C++获取任务栏打开程序窗口示例

    复制代码 代码如下: // File: OpenProgramOnTaskbar.h #pragma once#include <vector> struct TaskInfo {    // 程序名称    CString strProgramName; // 窗口句柄    HWND hWnd;}; class TaskbarInfo{public:    // 回调函数    static BOOL CALLBACK EnumWindowProc(HWND hWnd, LPARAM lP

随机推荐