VC可执行程序中打开另一个可执行程序并将其嵌入到主程序中

JF_Kang 2016-01-08 10:54:46
如何在VC窗体中通过点击按钮打开另外一个可执行程序,比如ProE软件,而且还需要将ProE软件嵌入到VC窗体中指定的每个区域内。之前也查过相关方面的资料,大多采用WinExec,ShellExecute ,CreateProcess。我是选择ShellExecute打开那个Proe软件,但是如何将Proe软件嵌套到指定窗口不太清楚怎做,还请各位大神赐教,不甚感激!
...全文
2319 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
magicpapacy 2016-01-13
  • 打赏
  • 举报
回复
引用 24 楼 JF_Kang 的回复:
[quote=引用 21 楼 magicpapacy 的回复:] 仅仅是把目标程序的窗口属性和坐标修改一下没多大意义啊,目标程序内标准子控件或自绘制控件如果没有根据WM_SIZE消息一起处理缩放移动的话,显示还是不正确啊,要做好的话还要HookGDI、GDI+、DX坐标系进行相应处理。。。
非常感谢您的回复! 您说的那种方案后期可能会继续深入下去,但是短期我想先将这个软件先嵌入上去。您觉得调整Proe界面大小后Proe窗口消失确切的原因是什么呢?我应该从哪些方面修改呢?由于这方面的基础比较薄弱,还望详解,谢谢![/quote] 我没有你写的代码也不知道你用的Proe版本,毕竟是别人的软件,有问题就用OD调试吧,窗口消失主要考虑透明度、窗口坐标、显示属性这几个方面,考虑你主要是修改窗口大小引起的,在SetWindowPos下函数断点看看吧
JF_Kang 2016-01-13
  • 打赏
  • 举报
回复
引用 23 楼 BeanJoy 的回复:
[quote=引用 21 楼 magicpapacy 的回复:] 仅仅是把目标程序的窗口属性和坐标修改一下没多大意义啊,目标程序内标准子控件或自绘制控件如果没有根据WM_SIZE消息一起处理缩放移动的话,显示还是不正确啊,要做好的话还要HookGDI、GDI+、DX坐标系进行相应处理。。。
那还要HOOK这些API,直接在父窗口的WM_SIZE中处理一下子程序窗口即可。[/quote] 谢谢赵老师! 您那边有相关示例吗?可否给我发些相关资料,邮箱是605270085@qq.com。谢谢!
JF_Kang 2016-01-13
  • 打赏
  • 举报
回复
引用 21 楼 magicpapacy 的回复:
仅仅是把目标程序的窗口属性和坐标修改一下没多大意义啊,目标程序内标准子控件或自绘制控件如果没有根据WM_SIZE消息一起处理缩放移动的话,显示还是不正确啊,要做好的话还要HookGDI、GDI+、DX坐标系进行相应处理。。。
非常感谢您的回复! 您说的那种方案后期可能会继续深入下去,但是短期我想先将这个软件先嵌入上去。您觉得调整Proe界面大小后Proe窗口消失确切的原因是什么呢?我应该从哪些方面修改呢?由于这方面的基础比较薄弱,还望详解,谢谢!
赵4老师 2016-01-12
  • 打赏
  • 举报
回复
让另一个程序运行在你创建的桌面中,你的程序嵌入一个远程桌面窗口连接到刚创建的桌面。
magicpapacy 2016-01-12
  • 打赏
  • 举报
回复
仅仅是把目标程序的窗口属性和坐标修改一下没多大意义啊,目标程序内标准子控件或自绘制控件如果没有根据WM_SIZE消息一起处理缩放移动的话,显示还是不正确啊,要做好的话还要HookGDI、GDI+、DX坐标系进行相应处理。。。
BeanJoy 2016-01-12
  • 打赏
  • 举报
回复
引用 21 楼 magicpapacy 的回复:
仅仅是把目标程序的窗口属性和坐标修改一下没多大意义啊,目标程序内标准子控件或自绘制控件如果没有根据WM_SIZE消息一起处理缩放移动的话,显示还是不正确啊,要做好的话还要HookGDI、GDI+、DX坐标系进行相应处理。。。
那还要HOOK这些API,直接在父窗口的WM_SIZE中处理一下子程序窗口即可。
schlafenhamster 2016-01-11
  • 打赏
  • 举报
回复
再给一次

	if(GoNotePad("",FALSE))
	{//
		Sleep(100);// let NotePad show window
		m_hwnd=::FindWindow("NotePad","无标题 - 记事本");
		if(m_hwnd)
		{
			LONG style=GetWindowLong(m_hwnd,GWL_STYLE);// 14CF 0000
// 1=WS_VISIBLE 4=WS_CLIPSIBLINGS C=WS_CAPTION;WS_THICKFRAME=4+WS_SYSMENU=8+WS_GROUP=2+WS_TABSTOP=1==F
			style &=~WS_CAPTION;
			style &=~WS_THICKFRAME;
			style |=WS_CHILD;
			SetWindowLong(m_hwnd,GWL_STYLE,style);
			CRect rc;
			GetClientRect(rc);
			rc.bottom-=60;
//			ClientToScreen(&rc);
//			afxDump << rc << "OK\n";
			::SetParent(m_hwnd,this->m_hWnd);
			::SetWindowPos(m_hwnd,HWND_TOP, rc.left, rc.top, rc.Width(), rc.Height(),SWP_FRAMECHANGED);
//			::BringWindowToTop(m_hwnd);
		}
	}
注意 风格: style &=~WS_CAPTION;// 没有 标题栏 , 原 sysmenu 要 放 主窗口 style &=~WS_THICKFRAME;// 不许 调整, 通过 主窗口 来调整。 style |=WS_CHILD;// 作为 子窗口
schlafenhamster 2016-01-11
  • 打赏
  • 举报
回复
(1)对于Proe软件,只有当第二次打开Proe软件时, Sleep(100);// let NotePad show window HWND hwnd=::FindWindow("NotePad","无标题 - 记事本"); 请调整 Sleep 务必 保证 Proe 窗口已显示,HWND hwnd=0 是不行的 (2)“会自动消失”, 可能到 主窗口 后面 了。 设 主窗口为 Proe 的 父窗口, 去 标题栏
BeanJoy 2016-01-11
  • 打赏
  • 举报
回复
引用 7 楼 schlafenhamster 的回复:
给你 一段 代码 试试, 问题在 改变 父窗口
借鉴,mark下。
JF_Kang 2016-01-11
  • 打赏
  • 举报
回复
引用 8 楼 schlafenhamster 的回复:

// by creating process ***********************************
BOOL GoNotePad(char *path,BOOL bWait=TRUE)
{
	char pathexe[MAX_PATH];
	strcpy(pathexe,"notepad.exe ");	
	strcat(pathexe,path);//pathname="notepad.exe ",
	STARTUPINFO sinfo;
	PROCESS_INFORMATION pinfo;
	memset (&sinfo,0,sizeof(STARTUPINFO));
	sinfo.cb=sizeof(STARTUPINFO);
	sinfo.dwFlags|=STARTF_USESHOWWINDOW;
	sinfo.wShowWindow=SW_SHOWNORMAL;//SW_SHOW;// SW_SHOWDEFAULT;
//BOOL fsuccess=0;
	BOOL fsuccess=CreateProcess(NULL,//lpApplicationName
				  pathexe,			//lpCommanderLine
				  NULL,				//lpProcessAttributes
				  NULL,				//lpThreadAttributes
				  FALSE,			//bInheritHandles
				  NORMAL_PRIORITY_CLASS,//dwCreationFlags
				  NULL,				//lpEnvironment
				  NULL,				//lpCurrentDirectory
				  &sinfo,			//lpStartupInfo
				  &pinfo);			//lpProcessInformation
// wait for NotePad finishes
	if(fsuccess)
	{
		HANDLE hProcess=pinfo.hProcess;
		CloseHandle(pinfo.hThread);// close thread at once
		if (bWait)
		{
			if (WaitForSingleObject(hProcess,INFINITE)!=WAIT_FAILED)
			{
				DWORD dwExitCode;
				GetExitCodeProcess(hProcess,&dwExitCode);
				if (dwExitCode==STILL_ACTIVE) AfxMessageBox(IDS_NOTEPAD_ALIVE);
			}
		}
		CloseHandle(pinfo.hProcess);
	}
	return(fsuccess);
}
非常感谢您的回复,调试这段代码后确实能够打开另一个外部的可执行程序,但是存在几个问题: (1)对于Proe软件,只有当第二次打开Proe软件时,第一个打开的Proe界面才能出现在VC的窗体内,如何才能实现第一次打开Proe软件时就直接嵌入到VC界面内呢? (2) 对于嵌入到VC窗体界面内的Proe界面,只要我对界面大小稍微调整下就会自动消失,但是我查看进程显示还在,请问这个怎么去设置呢?我见你博客里面有个关于CformVIew在改变大小时出现闪烁问题,与这个相关吗?还是另有其他解决方法?
JF_Kang 2016-01-11
  • 打赏
  • 举报
回复
引用 18 楼 zhao4zhong1 的回复:
[quote=引用 15 楼 JF_Kang 的回复:] [quote=引用 13 楼 zhao4zhong1 的回复:] CreateDesktop
非常谢谢!这个函数应该是用来处理与桌面相关操作,可否再详细讲下您的建议。[/quote] 搜MSDN中的例子代码Switcher[/quote] 谢谢赵老师!我这边没检索到那个示例,但是我看了下您说的那个Switching Desktops.(http://www.codeproject.com/Articles/7666/Desktop-Switching). 我觉得他的功能其实与上面schlafenhamster推荐的CreateProess差不多吧?通过该函数创建一个进程,而您推荐的是创建一个进程然后作为桌面显示,其实我想要实现的是通过CreateProess创建一个进程,然后嵌套在那个VC界面内。 由于水平有限,可能理解不到位,还请明示,谢谢!
JF_Kang 2016-01-11
  • 打赏
  • 举报
回复
非常谢谢!这个函数应该是用来处理与桌面相关操作,可否再详细讲下您的建议。[/quote] 搜MSDN中的例子代码Switcher[/quote] 谢谢赵老师!我这边没检索到那个示例,但是我看了下您说的那个Switching Desktops.(http://www.codeproject.com/Articles/7666/Desktop-Switching). 我觉得他的功能其实与上面schlafenhamster推荐的CreateProess差不多吧?通过该函数创建一个进程,而您推荐的是创建一个进程然后作为桌面显示,其实我想要实现的是通过CreateProess创建一个进程,然后嵌套在那个VC界面内。 由于水平有限,可能理解不到位,还请明示,谢谢!
赵4老师 2016-01-11
  • 打赏
  • 举报
回复
引用 15 楼 JF_Kang 的回复:
[quote=引用 13 楼 zhao4zhong1 的回复:] CreateDesktop
非常谢谢!这个函数应该是用来处理与桌面相关操作,可否再详细讲下您的建议。[/quote] 搜MSDN中的例子代码Switcher
JF_Kang 2016-01-11
  • 打赏
  • 举报
回复
引用 16 楼 schlafenhamster 的回复:
Sleep(100);// let NotePad show window m_hwnd=::FindWindow("NotePad","无标题 - 记事本"); 改为 while(!( m_hwnd=::FindWindow("NotePad","无标题 - 记事本"))) 试试
已经试过了,还是不行。可否加为好友QQ(605270085)聊聊。
schlafenhamster 2016-01-11
  • 打赏
  • 举报
回复
Sleep(100);// let NotePad show window m_hwnd=::FindWindow("NotePad","无标题 - 记事本"); 改为 while(!( m_hwnd=::FindWindow("NotePad","无标题 - 记事本"))) 试试
JF_Kang 2016-01-11
  • 打赏
  • 举报
回复
引用 13 楼 zhao4zhong1 的回复:
CreateDesktop
非常谢谢!这个函数应该是用来处理与桌面相关操作,可否再详细讲下您的建议。
JF_Kang 2016-01-11
  • 打赏
  • 举报
回复
引用 12 楼 schlafenhamster 的回复:
再给一次 .... 注意 风格: style &=~WS_CAPTION;// 没有 标题栏 , 原 sysmenu 要 放 主窗口 style &=~WS_THICKFRAME;// 不许 调整, 通过 主窗口 来调整。 style |=WS_CHILD;// 作为 子窗口
非常感谢!尝试以打开notapad.exe没有问题,第一次打开就直接出现在界面上,可是换成了ProE软件就不行,仍然还是上述问题,只有打开两个proe才能将第一个嵌套进去,而且一调整下大小还是消失。
赵4老师 2016-01-11
  • 打赏
  • 举报
回复
CreateDesktop
JF_Kang 2016-01-09
  • 打赏
  • 举报
回复
引用 2 楼 meryal 的回复:
这个很难实现,我个人认为需要对操作系统的框架进行改动,想单纯通过一个函数基本上实现不了。
根据目前所掌握的资料和请教过高手,反馈回来说有一定挑战。自己也没有做过这方面,所以希望大家能够详细帮忙解惑。 您说的对操作系统的框架的修改具体是指哪些方面?可否再具体点,谢谢的回复!
JF_Kang 2016-01-09
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
获得窗口句柄,::SetWindowPos
谢谢!你说的仅是或的Proe软件窗口的句柄吧?那具体如何将这个窗口嵌入到主程序的窗体中呢?希望能够详细点。
加载更多回复(6)

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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