2

我有一个 bat 可以同时启动 35 个屏幕共享连接。现在,我右键单击任务栏和“并排显示窗口”,但顺序有点随机。我想知道是否有一种编程方法来调整显示的大小和排序,无论是从命令行、python、C# 或 C++、java 还是任何可能最有效的语言,我对环境并不挑剔。计算机正在运行 Windows 7,如果这是相关信息。任何人都知道任何可以为我指明正确方向的 API 或事物吗?

4

3 回答 3

2

好的大家,我用了pywinauto,经过挖掘,我想通了。这不是适合每个人的完美模板,但我将解释我的思考过程和一些片段。我正在尽我所能,花哨的合并和你有什么,来订购窗户。但是我忽略了一个细节:您需要它们的顺序与它们在图形中的顺序完全不对应。我建议您对两个数组进行排序,一个基于您希望它们的顺序(IE 按标题或文本或类),一个基于所有位置的顺序。无论如何,进入代码

以下是如何与任务栏交互以并排设置所有窗口:

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()

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

接下来,收集你关心的窗口:

initlist = pywinauto.findwindows.find_windows()

这只会找到所有窗口。您可以在文档中更多地缩小您想要的范围,但并排并不是一开始就排他的。

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

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。我们实际上没有要排序的二维数组或网格,所以我对左侧进行加权,因为下一列中的任何内容在列表中更靠后。

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

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

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

希望这很清楚,并在未来帮助某人。

于 2015-08-26T21:22:34.573 回答
1

尝试

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

于 2015-08-24T14:53:36.593 回答
0

我也遇到了这个问题,这就是我的解决方案(如果你使用 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())
于 2022-02-23T23:23:53.223 回答