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

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

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

有没有什么好的方法可以实现?
...全文
353 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。

15,473

社区成员

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

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