WPF 使用SetParent嵌套窗口
有点类似与Winform的MDI窗口。
使用函数为SetParent和MoveWindow(经常配合)。
[DllImport("user32.dll", SetLastError = true)]
public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint); [DllImport("user32.dll", EntryPoint = "SetParent")]
public static extern int SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
给个小例子,例如嵌套TIM的聊天窗口
其中window1 就是新建的窗口 里面什么都没有写,默认
public partial class MainWindow : Window
{
[DllImport("user32.dll", SetLastError = true)]
public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint); [DllImport("user32.dll", EntryPoint = "SetParent")]
public static extern int SetParent(IntPtr hWndChild, IntPtr hWndNewParent); [DllImport("User32.dll", EntryPoint = "FindWindow")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32", EntryPoint = "GetDesktopWindow")]
public static extern IntPtr IntPtrGetDesktopWindow(); public MainWindow()
{
InitializeComponent(); }
int baseSize =;
bool IsOpen = false;
int Num = ;
Window1 window;
private void MainWindow_Closed(object sender, EventArgs e)
{
// var childhwnd = FindWindow("TXGuiFoundation", "唐大人的 iPhone");
var d = SetParent(childhwnd, IntPtrGetDesktopWindow());
MoveWindow(childhwnd, , , baseSize + Num+, baseSize + Num+, true);
}
IntPtr childhwnd;
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
IntPtr hwnd = new WindowInteropHelper(window).Handle;
childhwnd = FindWindow("TXGuiFoundation", "唐大人的 iPhone");
//(IntPtr)Convert.ToInt32("000307BA", 16);
var d = SetParent(childhwnd, hwnd);
MoveWindow(childhwnd, , , , , true);
} private void Button_Click(object sender, RoutedEventArgs e)
{
if (!IsOpen)
{
window = new Window1();
window.Loaded += MainWindow_Loaded;
window.Closed += MainWindow_Closed;
window.Show();
IsOpen = true;
Num++;
return;
}
Num++;
window.Close();
IsOpen = false;
} }
截图
SetParent的问题:
1 使用API后,子窗口在父窗口中不显示但是可以显示鼠标的拖拉动作(窗口调整)
2 使用API后,子窗口在父窗口中不再具有焦点,也不可以点击,看起来和图片差不多
3 使用API后,子窗口在原桌面留下空白且可以在空白操控父窗口内的子窗口而在父窗口内则是不可以操作子窗口(针对firefox浏览器[官方发行版])
相对来说嵌套的问题不少,可以说有很多问题。 本文中的代码是可以解决问题1(就是修改窗口的大小,嵌套时窗口大小要大于原先,释放时也要大于嵌套时,如果对释放和嵌套时对大小有要求可以多次修改窗口大小)。其他问题则是需要考虑windows消息机制(个人看法)了。
至于如何释放子窗口则是将子窗口的父窗口重新设置回去就好了。
WPF 使用SetParent嵌套窗口的更多相关文章
- [WPF疑难] 继承自定义窗口
原文 [WPF疑难] 继承自定义窗口 [WPF疑难] 继承自定义窗口 周银辉 项目中有不少的弹出窗口,按照美工的设计其外边框(包括最大化,最小化,关闭等按钮)自然不同于Window自身的,但每个弹出框 ...
- [WPF疑难]如何禁用窗口上的关闭按钮
原文 [WPF疑难]如何禁用窗口上的关闭按钮 [WPF疑难]如何禁用窗口上的关闭按钮 周银辉 哈哈,主要是调用Rem ...
- 【.net 深呼吸】WPF 中的父子窗口
与 WinForm 不同,WPF 并没有 MDI 窗口,但 WPF 的窗口之间是可以存在“父子”关系的. 我们会发现,Window 类公开了一个属性叫 Owner,这个属性是可读可写的,从名字上我们也 ...
- WPF编程,指定窗口图标、窗口标题,使得在运行状态下任务栏显示窗口图标的一种方法。
原文:WPF编程,指定窗口图标.窗口标题,使得在运行状态下任务栏显示窗口图标的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_4330793 ...
- WPF 一个空的 WPF 程序有多少个窗口
原文:WPF 一个空的 WPF 程序有多少个窗口 好多小伙伴说 WPF 的程序有五个窗口,但是我尝试使用了 EnumThreadWindows 去获取的时候居然拿到了 10 多个窗口 在 WPF 内部 ...
- WPF:拖动父窗口行为
原文 WPF:拖动父窗口行为 这次只是一个快速的帖子:当我点击并拖动特定的UIElement时,我需要能够重新定位WPF窗口.目的是重新创建在标准Windows标题栏上单击和拖动的行为(在我的情况下, ...
- 好玩的WPF第一弹:窗口抖动+边框阴影效果+倒计时显示文字
原文:好玩的WPF第一弹:窗口抖动+边框阴影效果+倒计时显示文字 版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csd ...
- wpf C# 操作DirectUI窗口 SendMessage+MSAA
原文:wpf C# 操作DirectUI窗口 SendMessage+MSAA 最近做一个抓取qq用户资料的工具,需要获取qq窗口上的消息,以前这种任务是用句柄获取窗口中的信息,现在qq的窗口用的是D ...
- WPF 程序鼠标在窗口之外的时候,控件拿到的鼠标位置在哪里?
原文:WPF 程序鼠标在窗口之外的时候,控件拿到的鼠标位置在哪里? 在 WPF 程序中,我们有 Mouse.GetPosition(IInputElement relativeTo) 方法可以拿到鼠标 ...
随机推荐
- 32(1).层次聚类---AGNES
层次聚类hierarchical clustering 试图在不同层次上对数据集进行划分,从而形成树形的聚类结构. 一. AGNES AGglomerative NESting:AGNES是一种常用的 ...
- 如何在Mac上使用Netstat命令
macOS上的netstat命令是一个终端命令,用于显示有关Mac网络通信的详细信息.网络通信包括Mac通过所有端口和所有应用程序与外界进行交流的所有方式.掌握netstat可以帮助您了解计算机之间的 ...
- 无需重新安装软件,将软件从C盘移至其他盘(mklink)
事先说明,这篇博文算是视频的文字转载版,来源为该视频的五分钟后内容→https://www.bilibili.com/video/av78397784/ 如何拯救标红的C盘[高玩] 有时候安装软件会手 ...
- 【docker构建】基于docker构建rabbitmq消息队列管理服务
1. 拉取镜像 # 可以在官网查看版本 [root@VM_0_10_centos wordpress]# docker pull rabbitmq:3.7.7-management 2. 根据拉取的镜 ...
- Selenium(三):操控元素的基本方法
1. 操控元素的基本方法 选择到元素之后,我们的代码会返回元素对应的 WebElement对象,通过这个对象,我们就可以操控元素了. 操控元素通常包括: 点击元素 在元素中输入字符串,通常是对输入框这 ...
- CSS定位和滚动条
0805自我总结 一.绝对定位 position: absolute; /*绝对定位: 1.定位属性值:absolute 2.在页面中不再占位(浮起来了),就无法继承父级的宽度(必须自己自定义宽度) ...
- jQuery学习笔记Fisrt Day
跳过JS直接JQUERY,“不愧是你”. 对就是我. 今天开始jQuery学习第一天. click事件方法: 鼠标点击 dbl事件方法: 双击鼠标 mouseenter事件方法: 鼠标进入 mouse ...
- HTML5播放视频,并使用ffmpeg对视频转编码
网页加入视频可以用h5自带的video标签,这里用一个jQuery封装优化好的video视频组件videojs. videojs官方网站:https://docs.videojs.com/index. ...
- Spring Boot 2 使用自定义配置
在application.yml定义配置后,可以使用Environment来读取配置,也可以使用@Value注解让业务代码去读取配置.如果属性较多,可以定义属性映射对象. 开发环境:IntelliJ ...
- scp跨服务器拷贝,后台运行
[转载]原文:https://blog.csdn.net/u013091013/article/details/68941250 通常情况下,我门在同一台服务器拷贝数据最常用的命令便是cp,如果要在不 ...