首页 > 其他分享 >命令行窗口排列 https://share.weiyun.com/EykMqNix 密码:ydvrx5

命令行窗口排列 https://share.weiyun.com/EykMqNix 密码:ydvrx5

时间:2024-01-22 17:33:27浏览次数:105  
标签:ydvrx5 窗口 hwnd cmd share weiyun RECT HWND rect

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// Copyright © 2022, 飞麦 <[email protected]>, All rights reserved.

#include <tchar.h>
#include <windows.h>
#include "Shlwapi.h"  // StrStrI
#pragma comment(lib, "ShLwApi.Lib")

struct HWND_RECT {
    HWND hwnd;  // 窗口句柄
    RECT rect;  // 窗口位置
};
static HWND_RECT hwnd_rect_a[MAX_PATH];  // 260:最多命令行窗口数
static int hwnd_num;  // 实际命令行窗口数


typedef HWND_RECT const* LP_HWND_RECT;
typedef void(__cdecl* MyDealFunc)(HWND& hwnd, RECT& cmd_rect);


// 根据窗口标题筛选命令行窗口
static BOOL CALLBACK enum_child_proc(_In_ HWND hwnd, _In_ LPARAM lParam) {
    static TCHAR caption[MAX_PATH];
    if (GetWindowText(hwnd, caption, MAX_PATH) > 0)  // 获取窗口标题成功
        if (StrStrI(caption, _T("\\Windows\\System32\\cmd.exe")))  // 是命令行窗口
            if (hwnd_num < MAX_PATH)  // 未超过最大个数
                hwnd_rect_a[hwnd_num++].hwnd = hwnd;
    return TRUE;  // 表示继续枚举窗口
}

// 枚举桌面的所有子窗口
static void got_cmd_windows() {
    HWND hWndParent = GetDesktopWindow();
    WNDENUMPROC lpEnumFunc = enum_child_proc;
    LPARAM lParam = NULL;
    EnumChildWindows(hWndParent, lpEnumFunc, lParam);
}

// 获取桌面位置与大小
static RECT got_desk_rect() {
    HWND desk_hwnd = GetDesktopWindow();
    RECT desk_rect;
    GetWindowRect(desk_hwnd, &desk_rect);
    return desk_rect;
}

// 根据最左边的位置比较各命令行窗口的顺序
static int compare_left(LPCVOID a, LPCVOID b) {
    LP_HWND_RECT p_hwnd_rect_a = reinterpret_cast<LP_HWND_RECT>(a);
    LP_HWND_RECT p_hwnd_rect_b = reinterpret_cast<LP_HWND_RECT>(b);
    return p_hwnd_rect_a->rect.left - p_hwnd_rect_b->rect.left;
}

// 计算任务栏高度
static LONG calc_tray_height() {
    LPCTSTR lpClassName = _T("Shell_TrayWnd");  // 任务栏窗口类名
    LPCTSTR lpWindowName = NULL;  // 所有窗口名称都匹配
    HWND tray_hwnd = FindWindow(lpClassName, lpWindowName);
    RECT tray_rect;
    GetWindowRect(tray_hwnd, &tray_rect);
    LONG tray_height = tray_rect.bottom - tray_rect.top;
    return tray_height;
}

// 获取某命令行窗口的位置与大小
static void got_rects(HWND& hwnd, RECT& cmd_rect) {
    // SW_NORMAL:激活并显示窗口,如果窗口最小化、最大化或隐藏,系统会将其还原到其原始大小和位置
    ShowWindow(hwnd, SW_NORMAL);  // 窗口隐藏或最小化时无法获得其位置与大小
    GetWindowRect(hwnd, &cmd_rect);  // 获取命令行窗口位置与大小
}

// 对各命令行窗口排序(按照最左边的位置)
static void sort_cmd_windows() {
    qsort(hwnd_rect_a, hwnd_num, sizeof(HWND_RECT), compare_left);
}

// 计算各命令行窗口的合理位置与大小
static void calc_loc_size() {
    if (hwnd_num <= 0)
        return;
    RECT desk_rect = got_desk_rect();
    LONG desk_width = desk_rect.right - desk_rect.left;
    LONG tray_height = calc_tray_height();
    RECT& cmd_rect = hwnd_rect_a[0].rect;  // 以首个命令行窗口为准
    LONG cmd_width = cmd_rect.right - cmd_rect.left;  // 计算命令行窗口统一宽度
    LONG desk_height = desk_rect.bottom - desk_rect.top;  // 计算桌面高度
    LONG rest_width = desk_width - cmd_width;  // 剩余宽度 = 桌面宽度 - 命令行窗口宽度
    LONG from = 0;  // 最左命令行窗口左边坐标
    LONG distance = 0;  // 各命令行窗口左边坐标的间距
    if (hwnd_num > 1)  // 如果有多个命令行窗口
        distance = rest_width / (hwnd_num - 1);  // 使命令行窗口均匀分布
    else
        from = rest_width / 2;  // 使命令行窗口位于中央
    LONG cmd_height = desk_height - 16 - tray_height;  // 各命令行窗口与桌面(除远程桌面栏及任务栏外)等高
    LONG top = desk_rect.top + 16;  // 各命令行窗口顶坐标与桌面(扣除远程桌面栏)相同
    LONG bottom = top + cmd_height;  // 各命令行窗口底位置
    for (auto i = 0; i < hwnd_num; i++) {
        RECT& cmd_rect = hwnd_rect_a[i].rect;
        cmd_rect.left = from + distance * i;
        cmd_rect.right = cmd_rect.left + cmd_width;
        cmd_rect.top = top;
        cmd_rect.bottom = bottom;
    }
}

// 设置某命令行窗口的位置与大小
static void chg_rects(HWND& hwnd, RECT& cmd_rect) {
    LONG cmd_width = cmd_rect.right - cmd_rect.left;
    LONG cmd_height = cmd_rect.bottom - cmd_rect.top;
    // HWND_TOP:将窗口置于 Z 顺序的顶部
    // SWP_ASYNCWINDOWPOS:如果调用线程和拥有窗口的线程附加到不同的输入队列,则系统会将请求发布到拥有窗口的线程
    SetWindowPos(hwnd, HWND_TOP, cmd_rect.left, cmd_rect.top, cmd_width, cmd_height, SWP_ASYNCWINDOWPOS);
}

// 枚举处理各命令行窗口
static void deal_cmd_windows(MyDealFunc func) {
    for (auto i = 0; i < hwnd_num; i++) {
        HWND_RECT& hwnd_rect = hwnd_rect_a[i];
        func(hwnd_rect.hwnd, hwnd_rect.rect);
    }
}

// 自动对多个命令行窗口设置位置与大小
int WINAPI _tWinMain(_In_ HINSTANCE, _In_opt_ HINSTANCE, _In_ LPTSTR, _In_ int) {
    got_cmd_windows();
    deal_cmd_windows(got_rects);
    sort_cmd_windows();
    calc_loc_size();
    deal_cmd_windows(chg_rects);
    return 0;
}

标签:ydvrx5,窗口,hwnd,cmd,share,weiyun,RECT,HWND,rect
From: https://www.cnblogs.com/fitmap/p/17980571

相关文章

  • shared_ptr 循环引用以及解决办法
    问题代码#include<memory>#include<stdio.h>usingnamespacestd;classA;classB{public:B(){printf("B()\n");}~B(){printf("~B()\n");} voidprint(){printf("B\n");}shared_ptr<A>ptr......
  • Microsoft 365 新功能速递:Microsoft 365 Apps中在Share Control选择要邀请的人
    51CTOBlog地址:https://blog.51cto.com/u_13969817Microsoft将在2024年2月初发布新的Inviteflow更新发送电子邮件体验,而不是发送共享链接。以往,使用“发送电子邮件”的客户在点击“发送”按钮后会认为他们可能过度共享了。这一变化有助于在与他人共享文件时更好地符合客户的期望,帮......
  • Python 通过 akshare 绘制中国平安均线并显示买卖点
    继续上篇,通过akshare绘制中国平台的均线,并在5日线上穿10日线的时候,显示买入信号,在5日线下穿10日均线的时候,显示卖出信号环境:python3.9(miniconda3)、Pycharm、Win10需要用的模块或者工具库:akshare(1.11.91)、pandas(2.1.1)、numpy(1.26.2)、matplotlib(3.8.2)、mplfinanc......
  • c++_shared库引入的问题
    项目组提供了一个AAR文件供下游业务团队集成。某天,下游团队反馈了一个紧急的问题,最终客户的开发者使用AndroidStudio打包时,构建工具提示构建失败,原因是存在重复的c++_shared库文件,建议使用pickFirst命令来修复。最终客户的开发者查阅了一些资料,按照帖子的建议,在项目对应的build......
  • Oracle数据库统计信息_执行计划_sharedpool等的知识梳理
    Oracle数据库统计信息_执行计划_sharedpool等的知识梳理背景最近有项目出现了年底业务量增加时卡顿的情况.同事多次发现执行SQL缓慢.但是重新执行统计信息更新后问题就优化的现象.12月份上半月解决测试环境的SQLServer卡顿时基本上也是这个套路重建索引,添加必要索引的方......
  • SharePoint 开发:如何通过脚本生成Site Collection的Permission Report
    Blog链接:https://blog.51cto.com/13969817越来越多的企业,为了数据安全或者审计的需求,需要管理员定期将SharePoint网站集权限生成报告,其中包括:·      网站集下所有子网站的权限设置·      网站集管理员列表·      应用于每个SharePoint对象的权限,如网站(子网......
  • C++17里面的读写锁(shared_lock读锁,unique_lock写锁)
    C++标准库本身没有直接提供读写锁,但C++11引入了一些工具,例如std::shared_mutex(C++14引入的,C++17之前的标准库中可能不支持)以及相关的读锁定(std::shared_lock)和写锁定(std::unique_lock)机制,用于实现读写锁的功能。下面是一个简单的示例,演示如何使用std::shared_mutex实现读写锁: ......
  • shared_preferences缓存
    封装import'dart:convert';import'package:shared_preferences/shared_preferences.dart';classJSpUtil{JSpUtil._internal();//私有的构造方法,防止外部实例化factoryJSpUtil()=>_instance;//工厂方法,返回JSpUtil唯一实例staticlatefinalJSpU......
  • 借shared_ptr实现写时复制(COW)
    原理1、使用智能指针管理共享资源2、write端,若引用计数为1,则write端独占资源,若引用计数不为1,则对共享资源备份进行写操作,以确保线程安全3、read端,读之前引用计数加1,write端此时若并发访问共享资源,则会发现引用计数不为1,write端不会直接写共享资源,确保线程安全代码#include<m......
  • [C++] 智能指针(shared_ptr、unique_ptr)
    作者:丶布布......