如何使用C#移动多个应用窗口且保证窗口之间不相互重叠
问题根因
- 你使用的
rnd.Next(0, 1)语法逻辑错误:C#中Random.Next(min, max)的返回值范围为[min, max),即包含最小值、不包含最大值,所以该调用永远返回0,窗口不会产生有效位移,始终保持初始打开的重叠状态。 - 原有逻辑未给不同记事本窗口分配独立的排列坐标,没有错开位置的规则,自然无法实现平铺不重叠的效果。
- 原有代码未显式声明
Random类实例,运行时会抛出未定义变量的报错。
修复方案
你可以先收集所有运行中的记事本进程,再给每个进程按遍历顺序分配固定的位置偏移,就能实现错开平铺的效果,还可以叠加小范围随机值实现轻微位移效果,参考实现代码如下:
using System; using System.Diagnostics; using System.Windows.Forms; using WindowScrape.Types; namespace test { public partial class Form1 : Form { [System.Runtime.InteropServices.DllImport("user32.dll")] private static extern bool SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); // 全局声明Random实例,避免重复创建生成重复随机值 private Random rnd = new Random(); // 定义每个窗口的固定偏移量,可根据需求调整数值 private const int OffsetStep = 30; private void Form1_Load(object sender, EventArgs e) { timer1.Start(); } private void timer1_Tick(object sender, EventArgs e) { uint SWP_NOSIZE = 0x0001; // 先收集所有记事本进程 var notepadProcesses = Process.GetProcessesByName("notepad"); for (int i = 0; i < notepadProcesses.Length; i++) { var process = notepadProcesses[i]; var lol = HwndObject.GetWindowByTitle(process.MainWindowTitle); // 按索引计算基础偏移位置,确保每个窗口错开 int baseX = i * OffsetStep; int baseY = i * OffsetStep; // 叠加小范围随机值实现轻微抖动效果,不需要可以直接删除 int finalX = baseX + rnd.Next(0, 5); int finalY = baseY + rnd.Next(0, 5); SetWindowPos(process.MainWindowHandle, 0, finalX, finalY, 0, 0, SWP_NOSIZE); } } } }
内容的提问来源于stack exchange,提问作者rainbowisrainbow
相关产品推荐
相关产品推荐

