C# SetWindowPos函数

在C#中,SetWindowPos函数用于设置窗口的位置和大小。

原型:

[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

参数说明:

  • hWnd: 要设置位置和大小的窗口的句柄(handle)。

  • hWndInsertAfter: 确定窗口的 Z 顺序,即窗口如何在 Z 顺序中放置。通常可以使用以下值之一:

    • IntPtr.Zero: 将窗口放在 Z 顺序的顶部。
    • new IntPtr(-1): 将窗口放在所有非顶层窗口的顶部。
    • new IntPtr(-2): 将窗口放在所有窗口的顶部。
    • 其他窗口句柄:将窗口放在指定窗口的顶部。
  • XY: 窗口的新位置的左上角的 X 和 Y 坐标。

  • cxcy: 窗口的新宽度和高度。

  • uFlags: 设置窗口位置和大小的标志。可以使用以下标志的组合来控制窗口的行为:

    • SWP_NOSIZE: 维持当前尺寸(忽略 cx 和 cy 参数)。

    • SWP_NOMOVE: 维持当前位置(忽略 X 和 Y 参数)。

    • SWP_NOZORDER: 维持当前 Z 顺序(忽略 hWndInsertAfter 参数)。

    • SWP_SHOWWINDOW: 如果窗口在调用时是隐藏的,显示窗口。

    • SWP_HIDEWINDOW: 隐藏窗口。

    • SWP_NOACTIVATE: 不激活窗口。仅适用于SWP_SHOWWINDOW标志。

    • SWP_DRAWFRAME: 在调整窗口大小时,重绘窗口边框(通常与SWP_FRAMECHANGED一起使用)。

    • SWP_NOOWNERZORDER: 不改变拥有者窗口的 Z 顺序。

    • SWP_NOSENDCHANGING: 防止窗口接收WM_WINDOWPOSCHANGING消息。

    • SWP_FRAMECHANGED: 使系统发送WM_NCCALCSIZE消息,即使窗口的尺寸没有改变。

    • SWP_NOCOPYBITS: 防止窗口重绘。

    • SWP_NOREPOSITION: 不重新定位窗口,即使大小或位置发生变化。

示例用法:

1、改变窗口大小:

using System;
using System.Runtime.InteropServices;// 定义常量和方法签名
public class Win32
{[DllImport("user32.dll")]public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);public static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);public const uint SWP_SHOWWINDOW = 0x40;
}// 获取窗口句柄并调用 SetWindowPos 函数改变窗口大小
IntPtr hWnd = // 窗口句柄
int newX = // 新的 X 坐标
int newY = // 新的 Y 坐标
int newWidth = // 新的宽度
int newHeight = // 新的高度Win32.SetWindowPos(hWnd, Win32.HWND_TOPMOST, newX, newY, newWidth, newHeight, Win32.SWP_SHOWWINDOW);

其中窗口句柄可以使用FindWindow函数获取窗口句柄(后面同),如:

[DllImport("user32.dll", SetLastError = true)]public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);IntPtr hWnd = Win32.FindWindow(null, "窗口标题"); // 替换为窗口的类名或标题

2、移动到屏幕的左上角:

using System;
using System.Runtime.InteropServices;// 定义常量和方法签名
public class Win32
{public const int SWP_NOSIZE = 0x0001;public const int SWP_NOMOVE = 0x0002;public const int SWP_NOZORDER = 0x0004;public const int SWP_SHOWWINDOW = 0x0040;[DllImport("user32.dll", SetLastError = true)][return: MarshalAs(UnmanagedType.Bool)]public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
}// 在代码中调用 SetWindowPos 函数将窗口移动到屏幕左上角
IntPtr hWnd = // 窗口句柄
Win32.SetWindowPos(hWnd, IntPtr.Zero, 0, 0, 0, 0, Win32.SWP_NOSIZE | Win32.SWP_SHOWWINDOW);

3、使其成为Topmost窗口并移动到屏幕的左上角:

using System;
using System.Runtime.InteropServices;// 定义常量和方法签名
public class Win32
{public const int SWP_NOSIZE = 0x0001;public const int SWP_NOMOVE = 0x0002;public const int SWP_NOZORDER = 0x0004;public const int SWP_SHOWWINDOW = 0x0040;public const int HWND_TOPMOST = -1;public const int HWND_NOTOPMOST = -2;[DllImport("user32.dll", SetLastError = true)][return: MarshalAs(UnmanagedType.Bool)]public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
}// 在代码中调用 SetWindowPos 函数将窗口移动到屏幕左上角并设置为Topmost
IntPtr hWnd = // 窗口句柄
Win32.SetWindowPos(hWnd, Win32.HWND_TOPMOST, 0, 0, 0, 0, Win32.SWP_NOSIZE | Win32.SWP_SHOWWINDOW);

4、显示窗口:

using System;
using System.Runtime.InteropServices;// 定义常量和方法签名
public class Win32
{public const int SW_SHOWNORMAL = 1;[DllImport("user32.dll")]public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
}// 获取窗口句柄并调用 ShowWindow 函数显示窗口
IntPtr hWnd = // 窗口句柄
Win32.ShowWindow(hWnd, Win32.SW_SHOWNORMAL);

5、隐藏窗口:

using System;
using System.Runtime.InteropServices;// 定义常量和方法签名
public class Win32
{public const int SW_HIDE = 0;[DllImport("user32.dll")]public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
}// 获取窗口句柄并调用 ShowWindow 函数隐藏窗口
IntPtr hWnd = // 窗口句柄
Win32.ShowWindow(hWnd, Win32.SW_HIDE);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/759619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

金融知识分享系列之:KD指标

金融知识分享系列之:KD指标 一、KD指标二、KD指标计算三、KD指标原理四、KD指标应用 一、KD指标 KD信号提供入场的工具 名称:随机震荡指标参数:(9,3,3)组成:K线,D线,20轴&#xff0…

【Linux】传输层协议:TCP/UDP

目录 netstat pidof UDP协议 TCP协议 TCP协议段格式 TCP协议的相关机制 确认应答(ACK)机制 超时重传机制 连接管理机制 服务端状态转换 客户端状态转化 流量控制 流量控制常见问题: 滑动窗口 拥塞控制 延迟应答 面向字节流…

流畅的 Python 第二版(GPT 重译)(九)

第四部分:控制流 第十七章:迭代器、生成器和经典协程 当我在我的程序中看到模式时,我认为这是一个麻烦的迹象。程序的形状应该只反映它需要解决的问题。代码中的任何其他规律性对我来说都是一个迹象,至少对我来说,这表…

(day 14)JavaScript学习笔记(对象2)

概述 这是我的学习笔记,记录了JavaScript的学习过程。在写博客的时候我会尽量详尽的记录每个知识点。如果你完全没接触过JavaScript,那么这一系列的学习笔记可能会对你有所帮助。 今天继续学习对象,主要是this、getters和setters、原型&#…

vulhub中DNS域传送漏洞复现

DNS协议支持使用axfr类型的记录进行区域传送,用来解决主从同步的问题。如果管理员在配置DNS服务器的时候没有限制允许获取记录的来源,将会导致DNS域传送漏洞。 环境搭建 Vulhub使用Bind9来搭建dns服务器,但不代表只有Bind9支持AXFR记录。运行…

Power BI学习(数据可视化)

另一个也可以的工具是:Tableau 还有一个是:神策,主要是用于互联网的app的数据埋点 数据分析的过程: 数据源--数据清洗(power query)-构建指标 新建度量值(power pivot)-可视化&…

构建一个前端智能停车可视化系统

引言 随着城市化进程的加速,停车难问题日益突出。智能停车可视化系统通过实时展示停车场的车位信息,帮助用户快速找到空闲车位,提高停车效率。 目录 引言 一、系统设计 二、代码实现 1. 环境准备 2. 安装依赖 3. 创建停车场组件 4. 集…

能源新动力:移动电站行业洞察报告

在全球能源结构转型和灾害应急需求不断上升的背景下,移动电站作为一种新型的电力供应解决方案,正逐渐成为保障临时供电、支持灾难恢复、以及促进能源普及的关键技术。本报告旨在全面分析移动电站行业的发展现状、技术趋势、市场潜力及面临的挑战&#xf…

python与excel第三节

批量重命名多个工作簿的名称 import os file_path D:\\TEST\\python与excelfile_list os.listdir(file_path)# 给出工作簿名中包含的需要替换的旧关键字和新关键字old_book_name 订单new_book_name 产品print(修改前名称:,file_list)for i in file_list: #…

React—— props校验(非typescript校验类型)

非typescript环境下,当我们在封装组件的时候,接受props时传入的内容,需要做类型检测,那我们可以用props校验进行类型的检查。 props校验允许在创建组件的时候,就约定props的格式、类型等 实现步骤: 导入 …

FDU 2018 | 2. 集合交并

文章目录 1. 题目描述2. 我的尝试1. C容器2. 排序二路归并 1. 题目描述 AcWing 3688 集合交并 输入两个集合,分别求其交集和并集中元素的个数,每个集合中可能存在相同的元素,而最终的交集和并集中应该不存在。 输入格式 第一行输入两个整数 n…

MAC IntelliJ IDEA搭建Doris Fe

目录 版本信息 安装环境依赖 拉取源码 下载 Doris 编译依赖 修改系统最大文件句柄数 编译 Doris 配置 Debug 环境 生成 FE 代码 FE模块代码导入 配置 Debug FE 启动 FE 报错问题 版本信息 本次安装的doris版本信息为doris-2.1.0-rc11 IntelliJ IDEA 配置jdk17、m…

数据之王国:解析Facebook的大数据应用

引言 作为全球最大的社交媒体平台之一,Facebook拥有庞大的用户群体和海量的数据资源。这些数据不仅包括用户的个人信息和社交行为,还涵盖了广告点击、浏览记录等多方面内容。Facebook通过巧妙地利用这些数据,构建了强大的大数据应用系统&…

ansible 管理工具以及常用模块

一、前期准备 1、安装 yum install ansible 如果yum源没有ansible,需要提前配置yum源: mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup wget -O…

Web框架开发-Django模型层(数据库操作)

一、ORM介绍 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动ORM是“对象-关系-映…

[C++11] 智能指针(auto_ptr(弃用)、unique_ptr、shared_ptr、weak_ptr)详细解读

说明:本文主要解释auto_ptr、unique_ptr、shared_ptr、weak_ptr这几种智能指针。接下来我们对每一个指针类型进行详细说明并给出一些基本的使用方式,重在深入理解。 在 C 中,auto_ptr、unique_ptr、shared_ptr 和 weak_ptr四种智能指针主要用…

拌合楼管理系统(八) c#海康威视摄像头车牌识别

前言: c#调用海康威视SDK实现车牌识别 原本以为海康威视sdk的Demo里面没有车牌识别的实例,后来发现自己肤浅了,官方是有提供的,只是车牌识别是通过安防布警的方式实现的.程序主动监听,触发告警后获取到车牌信息. 一、接口调用的流程: 首先初始化sdk -> 开…

SQLiteC/C++接口详细介绍sqlite3_stmt类(四)

返回:SQLite—系列文章目录 上一篇:SQLiteC/C接口详细介绍sqlite3_stmt类(三) 下一篇:SQLiteC/C接口详细介绍sqlite3_stmt类(五) 7. sqlite3_bind_parameter_count函数 sqlite3_bind_param…

流畅的 Python 第二版(GPT 重译)(十一)

第二十章:并发执行器 抨击线程的人通常是系统程序员,他们心中有着典型应用程序员终其一生都不会遇到的用例。[…] 在 99%的用例中,应用程序员可能会遇到的情况是,生成一堆独立线程并将结果收集到队列中的简单模式就是他们需要了解…

Java newInstance方法学习

用newInstance与用new是有区别的,区别在于创建对象的方式不一样,前者是使用类加载机制; newInstance方法要求该 Class 对应类有无参构造方法; 执行 newInstance()方法实际上就是使用对应类的无参构造方法来创建该类的实例&#x…