首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在多个显示器上绘制所有窗口

在多个显示器上绘制所有窗口可以采用以下步骤:

  1. 获取所有窗口的句柄和位置信息。可以使用Windows API函数EnumWindowsGetWindowRect来获取所有窗口的句柄和位置信息。
  2. 创建一个窗口列表。可以使用一个哈希表或数组来存储所有窗口的句柄和位置信息。
  3. 对于每个窗口,绘制其边框和标题栏。可以使用Windows API函数DrawEdgeDrawCaption来绘制窗口的边框和标题栏。
  4. 重复步骤3,直到所有窗口都被绘制在多个显示器上。

以下是一个简单的示例代码:

代码语言:go
复制

package main

import (

代码语言:txt
复制
"fmt"
代码语言:txt
复制
"syscall"
代码语言:txt
复制
"unicode"

)

func main() {

代码语言:txt
复制
// 获取所有窗口的句柄和位置信息
代码语言:txt
复制
windows := getWindowsInformation()
代码语言:txt
复制
// 创建一个窗口列表
代码语言:txt
复制
windowList := make(map[int]struct {
代码语言:txt
复制
    handle  syscall.Handle
代码语言:txt
复制
    position struct {
代码语言:txt
复制
        x, y, w, h int
代码语言:txt
复制
    }
代码语言:txt
复制
})
代码语言:txt
复制
// 遍历所有窗口,绘制其边框和标题栏
代码语言:txt
复制
for _, window := range windows {
代码语言:txt
复制
    // 获取窗口句柄和位置信息
代码语言:txt
复制
    handle := window.handle
代码语言:txt
复制
    position := window.position
代码语言:txt
复制
    // 绘制窗口边框
代码语言:txt
复制
    drawEdge(handle, position.x, position.y, position.w, position.h)
代码语言:txt
复制
    // 绘制窗口标题栏
代码语言:txt
复制
    drawCaption(handle, position.x, position.y, position.w, position.h)
代码语言:txt
复制
    // 将窗口句柄和位置信息添加到窗口列表中
代码语言:txt
复制
    windowList[handle] = struct {
代码语言:txt
复制
        handle  syscall.Handle
代码语言:txt
复制
        position struct {
代码语言:txt
复制
            x, y, w, h int
代码语言:txt
复制
        }
代码语言:txt
复制
    }{handle: handle, position: position}
代码语言:txt
复制
}
代码语言:txt
复制
// 遍历窗口列表,绘制每个窗口的边框和标题栏
代码语言:txt
复制
for handle, window := range windowList {
代码语言:txt
复制
    // 获取窗口句柄和位置信息
代码语言:txt
复制
    position := window.position
代码语言:txt
复制
    // 绘制窗口边框
代码语言:txt
复制
    drawEdge(handle, position.x, position.y, position.w, position.h)
代码语言:txt
复制
    // 绘制窗口标题栏
代码语言:txt
复制
    drawCaption(handle, position.x, position.y, position.w, position.h)
代码语言:txt
复制
}

}

// 获取所有窗口的句柄和位置信息

func getWindowsInformation() []struct {

代码语言:txt
复制
handle  syscall.Handle
代码语言:txt
复制
position struct {
代码语言:txt
复制
    x, y, w, h int
代码语言:txt
复制
}

} {

代码语言:txt
复制
windows := make([]struct {
代码语言:txt
复制
    handle  syscall.Handle
代码语言:txt
复制
    position struct {
代码语言:txt
复制
        x, y, w, h int
代码语言:txt
复制
    }
代码语言:txt
复制
}, 0)
代码语言:txt
复制
err := windowsSystemInformation(syscall.GetDesktopWindow(), &windows)
代码语言:txt
复制
if err != nil {
代码语言:txt
复制
    panic(err)
代码语言:txt
复制
}
代码语言:txt
复制
return windows

}

// 获取窗口的边框和标题栏

func drawEdge(handle syscall.Handle, x, y, w, h int) {

代码语言:txt
复制
const (
代码语言:txt
复制
    left    = 1
代码语言:txt
复制
    right   = 2
代码语言:txt
复制
    top     = 3
代码语言:txt
复制
    bottom  = 4
代码语言:txt
复制
    caption  = 5
代码语言:txt
复制
)
代码语言:txt
复制
var style uint32
代码语言:txt
复制
var color uint32
代码语言:txt
复制
if s, ok := windowStyles[handle]; ok {
代码语言:txt
复制
    style = s
代码语言:txt
复制
} else {
代码语言:txt
复制
    style = 0
代码语言:txt
复制
}
代码语言:txt
复制
if s, ok := windowColors[handle]; ok {
代码语言:txt
复制
    color = s
代码语言:txt
复制
} else {
代码语言:txt
复制
    color = 0
代码语言:txt
复制
}
代码语言:txt
复制
// 获取窗口边框和标题栏的尺寸
代码语言:txt
复制
borderRect := syscall.Rect(x, y, x+w, y+h)
代码语言:txt
复制
titleRect := syscall.Rect(x, y, x+w, y+h)
代码语言:txt
复制
// 绘制边框
代码语言:txt
复制
if style&left != 0 {
代码语言:txt
复制
    drawRect(borderRect, color, style)
代码语言:txt
复制
}
代码语言:txt
复制
if style&right != 0 {
代码语言:txt
复制
    drawRect(borderRect, color, style)
代码语言:txt
复制
}
代码语言:txt
复制
if style&top != 0 {
代码语言:txt
复制
    drawRect(borderRect, color, style)
代码语言:txt
复制
}
代码语言:txt
复制
if style&bottom != 0 {
代码语言:txt
复制
    drawRect(borderRect, color, style)
代码语言:txt
复制
}
代码语言:txt
复制
// 绘制标题栏
代码语言:txt
复制
if style&caption != 0 {
代码语言:txt
复制
    drawRect(titleRect, color, style)
代码语言:txt
复制
}

}

// 获取窗口的标题栏

func drawCaption(handle syscall.Handle

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Android窗口管理分析(1):View如何绘制到屏幕上的主观理解

    窗口管理知识图谱.png WMS的作用是窗口管理 不负责View绘制 既然是概述,我们不妨直观的思考一个问题,Activity是如何呈现到屏幕上的,或者说View是如何被绘制到屏幕上来的?...wmParams.width = 800; wmParams.height = 800; mWindowManager.addView(mview, wmParams); 以上代码可以在主屏幕上添加一个...在利用WindowManager.addView添加窗口之前,TextView的onDraw不会被调用,也就说View必须被添加到窗口中,才会被绘制,或者可以这样理解,只有申请了依附窗口,View才会有可以绘制的目标内存...,但是从直观理解上,比较像子窗口(其实不是)。...每个View都有自己的onDraw回调,开发者可以在onDraw里绘制自己想要绘制的图像,很明显View的绘制是在APP端,直观上理解,View的绘制也不会交给服务端,不然也太不独立了,可是View绘制的内存是什么时候分配的呢

    2.2K61

    【MATLAB】基本绘图 ( 绘制多图 | 设置图形对话框在 Windows 界面的位置和大小 | 在一个图形上绘制多个小图形 )

    3文章目录 一、绘制多图 1、绘制多图 2、代码示例 二、设置图形对话框在 Windows 界面的位置和大小 三、在一个图形上绘制多个小图形 一、绘制多图 ---- 1、绘制多图 存在一种绘图情况 ,...需要同时展示两条曲线 , 但是二者的 x 或 y 轴差距过大 , 需要绘制在两个图中 ; 在绘制每个图前 , 先调用一次 figure , 就会在新的对话框中生成一张新的图形 ; 使用示例如下 :...500 像素 ; 三、在一个图形上绘制多个小图形 ---- 使用 subplot 可以指定内部的小图形 ; subplot(m, n, 1); m 参数 : 行数 ; n 参数与 : 列数 ; 第三个参数是...); axis equal tight 执行结果 : 上面绘制出来的图的效果 , 最正确的是第 张图的样式 equal , x 轴上长度 1 与 y 轴上长度 1 相同 , 是最直观的效果 ;...square 样式表示的是坐标轴的 x 轴和 y 轴长度相同 ; equal tight 样式是在 equal 样式基础上 , 贴边切割有效曲线图形 ;

    7K70

    在Kubernetes上安全地部署和运行多个租户

    随着 Kubernetes 成为现代云原生应用程序的基石,越来越多的组织寻求通过在同一个 Kubernetes 基础设施中运行多个租户来整合工作负载和资源。...为了解决这些问题,实践者在 Kubernetes 上安全部署多个租户主要有三个选择。...如何在 Kubernetes 上部署多个租户 选项 1:基于命名空间的隔离,结合网络策略、RBAC 和安全控制 命名空间是 Kubernetes 用于逻辑隔离的内置机制。...运营复杂性:管理、升级和监控多个集群需要大量资源。 可扩展性挑战:配置新集群可能会延迟租户入职。 选项 3:虚拟集群 虚拟集群在共享物理集群内提供特定于租户的控制平面。...资源争用 可能:所有租户共享集群资源,例如节点和控制平面,可能导致资源争用。 无:为每个租户提供专用资源,确保没有资源干扰。 可能:共享工作节点,但隔离的控制平面减少了对与控制平面相关的操作的争用。

    10010

    在 VS IDE 的属性窗口中为什么不是显示类的所有属性?

    在我使用 X# 来编写代码时,有这样一个经历,当我试图为某个类的某个属性赋值时(当然,我是通过搜索来获得需要如此操作),在对应的类实例所对应的属性窗口中,我想为之赋值的属性并没有显示出来。...在 VFP 中,有一个问题始终没有优雅的解决方案:对于类属性,有时,我们设计它时,需要将其“设置”为设计时只读,运行时可读/可写/可读写。...在VFP中,如果想实现这样的设计目的,通常情况下,是模仿想象的设计效果,使用仅在设计时执行的代码在设计时予以达成,或者,在属性说明里予以说明,并在使用时,自觉的遵循属性说明使用。...但是在X#中,已经可以和C#一样,优雅的予以解决。

    7110

    如何让IDEA像Eclipse一样在一个窗口打开多个项目

    在我们刚开始学习java的时候,使用的最多的ide工具就是eclipse,在eclipse中我们可以同时打开多个项目,很方便的在项目之间进行切换,刚开始接触idea的时候,我们发现在一个窗口只能打开一个项目...,如果需要打开多个项目就只能打开多个窗口,非常不方便,所以就需要让idea也能支持这样的功能。...在Eclipse中,我们打开的时候,他会让我们指定一个工作空间,这个工作空间里面存放的就是我们后面创建的项目Project IDEA里面没有工作空间的概念,只有项目,因为在IDEA中的项目Project...其实就是eclipse里面的workspace,project下面时module,IDEA时这么定义的,一个project下面可以包括多个模块model,所以我们在idea下面可以创建多个模块,每个模块对应一个单独的项目程序...然后重复同样的动作把eclipse下所有的maven项目依次导入

    4.9K20

    Windows 系统上用 .NETC# 查找所有窗口,并获得窗口的标题、位置、尺寸、最小化、可见性等各种状态

    在 Windows 应用开发中,如果需要操作其他的窗口,那么可以使用 EnumWindows 这个 API 来枚举这些窗口。 你可以使用本文编写的一个类型,查找到所有窗口中你关心的信息。...---- 需要使用的 API 枚举所有窗口仅需要使用到 EnumWindows,其中需要定义一个委托 WndEnumProc 作为传入参数的类型。 剩下的我们需要其他各种方法用于获取窗口的其他属性。...比如,我写了下面一个简单的示例,可以输出当前可见的所有窗口以及其位置和尺寸: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 using System;...如果不指定,则会找可见的,包含标题的,没有最小化的窗口。如果你希望找一些看不见的窗口,可以自己写过滤条件。 什么都不要过滤的话,就传入 _ => true,意味着所有的窗口都会被枚举出来。...如果设置为 null,将仅查找可见窗口。 /// 找到的所有窗口信息。

    1.9K30

    windows 系统下 workerman 在同一个运行窗口中开启多个 websocket 服务

    support 错误,意思 windows 中禁止在同一个文件中开启多个 websocket 服务send('hello websocket');};// 运行所有...Worker实例Worker::runAll(); 开启服务失败解决办法windows 版本的 workerman 不支持在同一个文件中实例化多个 Worker。...Worker实例(这里只有一个实例)Worker::runAll(); 同一个窗口中运行上面虽然可以解决运行多个 websocket 实例,但是你会发现有几个文件,就会有几个运行窗口如果开启的服务更多,...窗口也会更多,那么如何在同一个窗口中运行启动多个服务呢那么如果要解决这个问题,我们就可以创建一个 init.bat 文件,然后在文件中加入以下代码,然后双击运行即可实现在同一个窗口中启动多个服务/d:

    1.5K103

    在一个服务器上放多个网站会被分流吗?

    在一个服务器上,放多个网站,会被分流吗?会造成网站卡顿吗?  ...服务器的带宽不足的话,网站的同时打开操作速度会受影响,此处不包括服务商提供的服务器,他们的服务器每个网站空间会专门设定带宽和运行内存;另外,同一个服务器同一个IP放多个网站在搜索引擎优化上会相互影响,如果其中一个站是垃圾站被百度...同一服务器上,服务器够大、速度稳定,10几个网站模板不一样,白帽运营,不会受多大影响。 ...同一类内容,同一个ip,降权也会是在同一时间。 一个服务器上弄多个网站的话,如果在带宽不充足的情况下,可能会导致网站打开速度受到影响。

    4.3K10

    在Apache服务器上同时运行多个Django程序的方法

    昨天刚刚找了一个基于Django的开源微型论坛框架Spirit,部署在自己的小服务器上。...在脚本之家搜索到了一篇名为在Apache服务器上同时运行多个Django程序的方法,该文章声称可以在apache的配置文件中使用SetEnv指令来部署多站点Django, 但是在wsgi.py中已经存在...我还特意试了下,保留wsgi.py中已经存在os.environ.setdefault()不动,单独在apache的配置文件中使用SetEnv,证明确实没有解决问题。...函数对该环境变量设置另一个不同的值(如VAL2),会因为setdefault函数的特性导致无法设置为新值 也是因为上述这一点,如果进程A先设置了环境变量(如ENV=VAL1),而A启动了子进程B,子进程B会继承A进程的所有与环境变量...我去掉了wsgi.py中的os.environ语句,在apache配置文件中使用SetEnv进行配置文件的选择,奇怪的是不论在SetEnv后面有没有使用引号,该问题都无法解决,有时候报错为模块找不到(与背景中的报错信息相同

    3.6K30

    在一台Apache服务器上创建多个站点(不同域名)

    使用不同的域名来区分不同的网站,所有的域名解析都指向同一个 IP 地址。Apache通过在HTTP头中附带的 host参数来判断用户需要访问哪一个网站。...例如要在一台服务器上设置如下两个站点: http://www.test1.com http://www.test1.com ---------------------------------------...第一步:开启Apache的vhost模块 在 http.conf 配置文件中,找到下面的代码行,删除前面的 # 号,并开启这个 vhost 模块。...在 http.conf 文件中加入一行 Include /etc/httpd/conf/vhost.conf,将 vhost.conf 文件内容包含进来。...第三步:在/etc/hosts文件中将网站的域名绑定到本地环回地址上(在hosts文件末尾加入以下信息) 127.0.0.1 www.test1.com 127.0.0.1 www.test2.com

    3.3K20
    领券