CreateProcess()打开的应用程序弹出对话框的问题,急!

pake007 2008-07-02 05:24:48
我在Word上制作了一个插件,当点击这个插件按钮时,用CreateProcess()运行另一个程序App,App经过一些计算后弹出对话框D,现在的问题是怎样让这个对话框和Word的窗口能够共同行动,也就是像模态对话框那样的效果。

现在的情况是,由于对话框D是属于App的,所以在任务栏上有个缩略按钮,当打开其他一个窗口(比如其他的Word文档),再点击对话框D在任务栏的缩略按钮后,对话框就会跳到当前窗口之上。我现在希望只有在调用它的那个Word文档成为当前活动窗口时,D才蹦出来。

有没有什么好的方法可以实现?
...全文
359 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
pake007 2008-07-08
  • 打赏
  • 举报
回复
回来了,问题已解决,谢谢大家!散分了!
cnzdgs 2008-07-03
  • 打赏
  • 举报
回复
先试试用SetParent,如果返回失败就用SetWindowLong,nIndex给GWL_HWNDPARENT。
pake007 2008-07-03
  • 打赏
  • 举报
回复
回cnzdgs,谢谢你的建议!
不过怎么样设置对话框的Parent为Word视图呢? 我现在不能修改对话框的属性,因为对话框是我通过调用别人写的接口直接就Pop up出来的。 或者能在其他地方设置?请指教!
liyinlei 2008-07-03
  • 打赏
  • 举报
回复
如果要不阻塞,得用 非模态对话框
pake007 2008-07-03
  • 打赏
  • 举报
回复
看了一片文章,好像和我的问题差不多!
http://www-128.ibm.com/developerworks/cn/opensource/os-cn-eclrcp/
pake007 2008-07-03
  • 打赏
  • 举报
回复
太谢谢cnzdgs了,马上要出差几天了,回来解决后给分!
cnzdgs 2008-07-03
  • 打赏
  • 举报
回复
GetActiveWindow是取本线程窗口的,用它肯定不行。
CreateProcess之后,要过一段时间后窗口才会创建,所以立即执行GetForegroundWindow也得不到新进程的窗口。可以用WaitForInputIdle等待进程进入空闲状态后再取窗口句柄。另外通常用FindWindow根据窗口的类名或者标题来查找窗口。
SetWindowsHookEx也可以,但如果有其它可行方法时,尽量不要用Hook的方法,以免影响系统效率。
pake007 2008-07-03
  • 打赏
  • 举报
回复
To vinsendai

“绑”说的比较抽象,其实就是那个Win32 Console Application生成的对话框D不能弹到Word窗口的顶端,只是猥琐地最小化在任务栏里。
vinsendai 2008-07-03
  • 打赏
  • 举报
回复
"于是我就做了另外一个Win32 Console Application,让它去调用别人的库并弹出对话框,这样的话Word程序不会被阻塞了,但是对话框也无法和Word窗口“绑”在一起了。 "

这样做不可以么?不能绑在一起是什么意思?
pake007 2008-07-03
  • 打赏
  • 举报
回复
在CreateProcess前创建一个WH_SHELL钩子行不行?大家说
cnzdgs 2008-07-03
  • 打赏
  • 举报
回复
你先按我在1楼的回复试试。
pake007 2008-07-03
  • 打赏
  • 举报
回复
谢谢cnzdgs的建议,我试了一下SetParent,不过返回了NULL,因为取不到新窗口D的句柄
我把代码贴出来,大家看看怎么解决

void ShowNoticeButtonMessage(void *data)
{
// 获得当前窗口句柄(Word的窗口)
HWND parentHandle = ::GetActiveWindow();

PROCESS_INFORMATION pi;
STARTUPINFO si;
memset(&si,0,sizeof(si));
si.cb = sizeof(si);
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;

// Call 另一个Application,用来弹出子对话框
BOOL result = CreateProcess("C:\\Notice.exe",NULL,NULL,FALSE,NULL,
NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW,NULL,NULL,&si,&pi);


// 不管用GetActiveWindow还是GetForeGroundWindow都获取不到新对话框句柄,
// 都是只能获得Word窗口句柄,可能执行到这一句时新窗口还没弹出。那么有没有什么办法,等待新窗口确实弹出之后我再去取它的句柄。

HWND childHandle = ::GetActiveWindow();
//HWND childHandle = ::GetForegroundWindow();

HWND hwnd = SetParent(childHanle, parentHandle); //这里失败了!
}

pake007 2008-07-02
  • 打赏
  • 举报
回复
看来我说的太乱了,问题其实是这样产生的,编写的Word插件里调用了他人的COM接口,并弹出一个模态对话框D(D不是我做的,是别人的库里的,所以我无法改),但是我又需要在不关闭这个对话框的情况下打开另一个Word文档,可是由于D将Word Application阻塞了,无法打开。
于是我就做了另外一个Win32 Console Application,让它去调用别人的库并弹出对话框,这样的话Word程序不会被阻塞了,但是对话框也无法和Word窗口“绑”在一起了。

其实只要能满足不关闭对话框的情况下,不让Word进程阻塞就行了,Adobe Acrobat我也作了类似的插件,也有相同的问题。

请教大家,有什么好的机制可以解决?
cnzdgs 2008-07-02
  • 打赏
  • 举报
回复
不是很清楚你的意思,可以试试把word的视图设置为对话框的parent。
1、VC++编程环境介绍 ①、编程环境、编译器; ②、名词解释; ③、一个简单的MFC对话框工程; ④、个人认为在学习过程中可以看的不错书籍; ⑤、VC编译EXE在没装VC的电脑上运行出错问题解决! 2、ANSI与UNICODE ①、ANSI与UNICODE; ②、不同编码格式下的字符串处理及相互转化; ③、CString常用操作讲解。 3、模态对话框与非模态对话框 ①、模态与非模态对话框的创建; ②、新对话框的初始化工作; ③、两个对话框之间数据传递的几种方法。 4、对话框控件不同类型成员变量的绑定 ①、控件各种类型变量的绑定、最大值及最小值问题; ②、对话框数据交换与验证机制; ③、各种开源控件类的使用; ④、MFC与SDK API中同名函数问题。 5、VC中常用控件的用法讲解 ①、VC中常用控件的用法讲解见:http://www.cctry.com/thread-106-1-1.html ②、VS2008中新增控件的用法讲解。 6、定时器讲解 ①、定时器相关函数讲解:SetTimer、OnTimer、KillTimer; ②、利用定时器实现动态显示时间; ③、改变CStatic控件的文字颜色。 7、MFC对话框程序响应鼠标及键盘消息 ①、MFC对话框程序响应鼠标点击消息; ②、MFC对话框程序响应键盘按键消息; ③、MFC对话框程序响应组合键。 8、MFC对话框注册全局系统热键 9、控件自定义消息的响应: ①、响应按钮控件的右键消息; ②、响应Static控件的双击消息。 ③、自定义编辑框控件只读、颜色不变灰 10、再论“逃跑”按钮的实现 ①、MoveWindow、SetWindowPos、GetWindowRect函数讲解; ②、坐标系的变换。 11、通用对话框讲解 ①、文件选择对话框; ②、目录选择对话框; ③、让对话框程序支持拖拽。 12、菜单操作 ①、对话框程序添加菜单; ②、右键弹出式菜单; ③、菜单项的启用与禁用。 13、对话框的工具栏操作 ①、工具栏的创建; ②、工具栏按钮的响应。 14、对话框的状态栏操作 ①、状态栏的创建; ②、状态栏显示时钟、鼠标位置、鼠标点的颜色信息等。 15、一个简单计算器软件的编写 ①、计算功能的实现; ②、剪贴板操作:将计算结果保存到剪贴板。 16、文件的基本操作之CFile[Ⅰ] ①、文件的创建、打开、关闭; ②、文件的读写、何时读取完毕、读取一行数据; ③、文件指针位置的设置; ④、刷新缓存数据到文件; 17、文件的基本操作[Ⅱ] ①、文件的复制[适用于文件夹]; ②、文件的重命名或移动[适用于文件夹]; ③、文件的删除[只读属性]; 18、文件属性信息的获取与设置 ①、属性信息的获取:大小、时间、隐藏属性等; ②、属性信息的设置 [删除只读属性文件]; ③、判断文件是否存在以及是否为目录; 19、文件夹操作 ①、文件夹的创建与删除; ②、文件夹的属性信息的获取:时间、隐藏属性等; ③、文件夹大小的获取:遍历文件方法[下节课讲解]; 20、文件的遍历与查找小软件的编写[包括文件的各种属性信息] 21、系统各种路径信息的获取 ①、Windows、System32、temp、桌面目录、我的文档等目录的获取; ②、应用程序当前目录的获取与设置及存在的问题讲解; ③、可执行文件所在目录[包括EXE和DLL]; ④、工程当前目录与Debug调试目录的不同。 22、系统信息的获取 ①、当前用户名称、计算机名称的获取; ②、CPU、内存、硬盘信息的获取。 23、进程的相关操作 ①、进程创建的三种方法及CreateProcess参数存在的问题; ②、进程的结束; 进程的枚举 一个简单任务管理器的实现 MFC中动态数组、动态链表、映射表的讲解 ClistCtrl 的自绘操作!

15,467

社区成员

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

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