按字母顺序并排排序应用程序 windows

Sort application windows side by side in alphabetical order

我有一个可以同时启动 35 个屏幕共享连接的 bat。现在,我右键单击任务栏和 "Show windows side by side,",但顺序有点随机。我想知道是否有一种编程方法可以从命令行 python、C# 或 C++、java 或任何可能最有效的语言来调整显示大小和排序,我不挑剔环境。电脑是运行 windows 7,如果有相关资料的话。任何人都知道任何 API 或可以为我指明正确方向的事情吗?

尝试

来源:https://github.com/atinfo/awesome-test-automation

大家好,我用的是pywinauto,翻来覆去搞定了。这不是适合所有人的完美模板,但我将解释我的思考过程和一些片段。我尝试了所有可能的角度,花哨的合并排序和你有什么,来订购 windows。但我忽略了一个细节:您需要它们的顺序与它们在图形中的顺序根本不对应。我建议您对两个数组进行排序,一个基于您想要的顺序(IE 按标题或文本或 class),一个基于所有位置的顺序。无论如何,进入代码

以下是与任务栏交互以并排设置所有 windows 的方法:

import pywinauto
from pywinauto import taskbar

explorer = pywinauto.application.Application.connect(path = "explorer.exe")
pywinauto.controls.HwndWrapper.HwndWrapper(pywinauto.taskbar.TaskBarHandle()).RightClick()
explorer.PopupMenu.Menu().GetMenuPath("Show windows side by side")[0].Click()

可能是一种更简洁的方法,但这对我有用。

接下来,收集您关心的windows:

initlist = pywinauto.findwindows.find_windows()

这只会找到所有 windows。您可以在文档中缩小您想要的范围,但并排并不是排他性的。

此时我制作了两个具有不同属性的列表,一个是带有程序句柄和程序标题的数组列表,另一个是基于当前实例的坐标列表window:

for i in range (0, len(initlist)):
    orderlist.append([initlist[i], pywinauto.controls.HwndWrapper.HwndWrapper(initlist[i]).Texts(), pywinauto.controls.HwndWrapper.HwndWrapper(initlist[i])])
    poslist.append(pywinauto.controls.HwndWrapper.HwndWrapper(initlist[i]).Rectangle())

现在,我发现以图形方式呈现它们的最佳方式是在行之前遍历列。有些人可能不同意,但 Windows 并不总是有我所见的完美行数。所以,我们需要对第一个列表进行排序:

orderlist = sorted(orderlist, key=lambda x: x[1])

这是按标题索引排序的。然后我们对第二个列表进行排序:

poslist = sorted(poslist, key=lambda x: x.top + (x.left * 10000))

请注意我如何加权 x.left。我们实际上没有要排序的二维数组或网格,所以我对左侧进行了加权,因为下一列中的任何内容都在列表中更靠后的位置。

最后,我们再次遍历列表以交换 windows:

for x in range(0, len(orderlist)):
    orderlist[x][2].MoveWindow(poslist[x].left, poslist[x].top, poslist[x].width(), poslist[x].height())

这会将所有 windows 从 orderlist 的坐标设置为我们想要的所有 windows 的排序坐标。作为奖励,对于那些不均匀的 windows,它会调整它们的大小,以保持并排的视觉效果相同。

希望这是清楚的,并在将来帮助别人。

我也遇到过这个问题,这就是我的解决方案(如果你使用 Python 3.9,你可能会遇到问题):

import pywinauto
from pywinauto import taskbar

explorer = pywinauto.application.Application().connect(path = "explorer.exe")
pywinauto.controls.hwndwrapper.HwndWrapper(pywinauto.taskbar.TaskBarHandle()).right_click()
print(explorer.PopupMenu.menu().get_menu_path("Show windows side by side")[0].click_input())