将两个不同进程的窗口设置为父子关系

今天用WPF程序给一个第三方程序做插件,该程序支持通过菜单扩展的方式集成第三方程序,看起来像是弹出一个对话框。

但是,由于新写的WPF程序和原程序是没有任何关系的,一旦原程序重新获取焦点时,新弹出的WPF程序窗口就会切换到后台,看起来就不像子窗口了。看了一下之前的人们的做法,大多是将新蹦出来的窗口设置为TopMost,但这样就又引入了改窗口不能切换到后台隐藏的问题。

在网上搜了一下,找到了如下解决方法:http://stackoverflow.com/questions/2599053/how-to-set-win32-window-as-owner-of-wpf-window。具体就是通过WindowInteropHelper将外部窗口设置为Owner。

????var helper = new
WindowInteropHelper(myWpfChildWindow);
????helper->Owner = mainWindowHWND;

这样做确实解决问题了,但反过来一想,如果要让外部窗口作为WPF的子窗口,就无法用这个方法了。由于WPF程序本身就是调用的WindowsAPI,肯定WindowsAPI是支持两个不相干的窗口的父子关系设置的,便在referencesource上看了一下其源码,用的是如下代码:

UnsafeNativeMethods.SetWindowLong(new HandleRef(null, CriticalHandle),
????????????????NativeMethods.GWL_HWNDPARENT,????
????????????????_ownerHandle);

也就是说,它调用的是API SetWindowLong

????LONG WINAPI SetWindowLong(
???? _In_ HWND hWnd,
???? _In_ int nIndex,
???? _In_ LONG dwNewLong
????);

它有三个参数,第一个参数传入子窗口Handle, 第二个参数传入GWL_HWNDPARENT,第三个传入父窗口Handle。不过,MSDN上同时写着不建议使用这种方式设置父子关系,而需要用SetParent。我试了一下,用这种方式可以,反而用SetParent不行,既然微软自己都在用,暂且先用着,后续发现有问题再补充说明。

时间: 2024-11-05 21:38:18

将两个不同进程的窗口设置为父子关系的相关文章

Linux中的两种守护进程stand alone和xinetd

--http://www.cnblogs.com/itech/archive/2010/12/27/1914846.html#top 一般使用stand alone /etc/init.d/ 非常少用xinetd /etc/xinetd.d/ Linux守护进程的运行方式 1.独立运行(stand-alone)的守护进程 独立运行的守护进程由init脚本负责管理,所有独立运行的守护进程的脚本在/etc/rc.d/init.d/目录下.系统服务都是独立运行的守护进程,包括syslogd和cron等

Windows azure中公用云服务的两个虚机FTP的设置

在Windows azure中,若两个虚机公用一个云服务,则这两个虚机对互联网的IP即外网的IP是一样. 建立FTP的时候,在此处选择指定的用户,在两个虚机里要设置不同FTP用户的账户,并同时在FTP目录中添加对应的FTP账户!     这样在通过FTP链接的时候,输入相同的IP和不同的账号,则会连接到账号对应的虚机 Windows azure中公用云服务的两个虚机FTP的设置,布布扣,bubuko.com

js范例学习——窗口/框架与导航条设计之弹出窗口设置

1.弹出窗口设置 在JS中,可以使用window对象实现对窗口的控制. window常用方法: alert();弹出一个警告对话框: confirm();在确认对话框中显示指定的字符串: prompt();弹出一个可输入对话框: close();关闭被引用的窗口: foucus();将被引用的窗口放在所有打开窗口的最前方,成为焦点窗口: open();打开新的窗口并且显示由URL或名字引用的文档,可以创建窗口的属性: resizeTo(x,y);设置窗口的大小: resizeBy(offsetx

将电脑窗口设置为豆沙绿护眼色

xp系统: 桌面->右键->属性->外观->高级->项目(选择窗口).颜色(选择其它)将色调改为85:饱和度123:亮度205->添加到自定义颜色->确定->确定 win7系统: 桌面-> 右键 -> 个性化 -> 窗口颜色 -> 高级外观设置... -> 项目下拉列表中选择窗口 -> 点击颜色下拉列表选择其他 ->  将色调改为85:饱和度123:亮度205  -> 点击添加到自定义颜色  -> 在左部

【转】 c#中两个DateTimePicker,一个时间设置为0:0:0,另一个设置为23:59:59

[转] c#中两个DateTimePicker,一个时间设置为0:0:0,另一个设置为23:59:59 stp1为第一个DateTimePicker this.dtp1.Value=this.dtp1.Value.Date; stp2为第二个DateTimePicker 设置dtp2的值的时间部分是23:59:59. this.dtp2.Value = new DateTime(this.dtp2.Value.Year, this.dtp2.Value.Month, this.dtp2.Valu

进程与线程的定义、关系及区别

进程与线程的定义.关系及区别     --参考博客文章:http://blog.csdn.net/yanxiaolx/article/details/51763372 一.进程的定义 进程:指在系统中能独立运行并作为资源分配的基本单位,它是由一组机器指令.数据和堆栈等组成的,是一个能独立运行的活动实体. 进程一般有三个状态:就绪状态.执行状态和等待状态[或称阻塞状态]:进程只能由父进程建立,系统中所有的进程形成一种进程树的层次体系:挂起命令可由进程自己和其他进程发出,但是解除挂起命令只能由其他进

转:TCP/IP详解--举例明白发送/接收缓冲区、滑动窗口协议之间的关系

原文地址:http://blog.csdn.net/yusiguyuan/article/details/21439633#1536434-tsina-1-74921-66a1f5d8f89e9ad52626f6f40fdeadaa  TCP/IP详解--举例明白发送/接收缓冲区.滑动窗口协议之间的关系. 一个例子明白发送缓冲区.接受缓冲区.滑动窗口协议之间的关系. 在上面的几篇文章中简单介绍了上述几个概念在TCP网络编程中的关系,也对应了几个基本socket系统调用的几个行为,这里再列举一个例

QObject提供了QMetaObject元类信息(相当于RTTI和反射),信号与连接,父子关系,调试信息,属性,事件,继承关系,窗口类型,线程属性,时间器,对象名称,国际化

元类信息(相当于RTTI和反射),信号与连接,父子关系,调试信息,属性,事件,继承关系,窗口类型,线程属性,时间器,对象名称,国际化其中元类又提供了:classInfo,className,构造函数,多重祖先元类,method, property, Enumerator, Signal, Slot等等 http://doc.qt.io/qt-5/qobject.html http://doc.qt.io/qt-5/qmetaobject.html 我感觉Qt的出现,除了提供GUI以外,主要就是提

2019.9.30 Unity 3D之UI设置父子关系setParent坑

写在前面: 在做项目的时候,难免会碰到UI很多的情况,而动态加载UI就是一个很重要的问题.而动态加载UI就需要考虑到设置UI的父子关系.通常我们会使用transform.setparent(transform)来设置父子关系.到这里都还是没毛病.但是偏偏UI在设置父子关系的时候需要考虑到第二个参数.对于初学者往往会遇到UI加载出来,设置子物体后发现UI不见了,但是明明直接拖到UI层次中又是对的.这个问题就和第二个参数相关. worldPositionStays.所以这也是一个需要思考的问题. U