gpt4 book ai didi

c# - 垂直平铺windows c#

转载 作者:太空宇宙 更新时间:2023-11-03 15:13:53 25 4
gpt4 key购买 nike

我有以下垂直平铺窗口的代码,但此代码的问题是它垂直平铺所有窗口,但我只想平铺要垂直平铺的资源管理器窗口和记事本窗口,这是此代码调用的。这是我们的一位内部客户的要求,他们希望同时打开文件资源管理器和记事本,并且在打开时他们应该并排垂直平铺。

谁能帮忙解决这个问题

在此先感谢!!!

class Program
{
internal struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}

[DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
internal static extern IntPtr GetForegroundWindow();

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, ExactSpelling = true, SetLastError = true)]
internal static extern bool GetWindowRect(IntPtr hWnd, ref RECT rect);

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, ExactSpelling = true, SetLastError = true)]
internal static extern void MoveWindow(IntPtr hwnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, ExactSpelling = true, SetLastError = true)]
static extern unsafe bool CascadeWindows(IntPtr hWnd, int wHow, RECT[] lpRect, uint cKids, IntPtr[] lpKids);
[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
public static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags);
//fdfdfdf
[DllImport("user32.dll", EntryPoint = "TileWindows")]
static extern unsafe IntPtr TileWindows(IntPtr hWnd, int wHow, RECT[] lpRect, uint cKids, IntPtr[] lpKids);
[DllImport("User32.dll")]

static extern Int32 FindWindow(String lpClassName, String lpWindowName);

static void Main(string[] args)
{
const short SWP_NOMOVE = 0X2;
const short SWP_NOSIZE = 1;
const short SWP_NOZORDER = 0X4;
const int SWP_SHOWWINDOW = 0x0040;
const int MDITILE_SKIPDISABLED = 0x0002;
const int MDITILE_ZORDER = 0x0004;
const long WS_EX_TOPMOST = 0x00000008L;
const int MDITILE_HORIZONTAL = 0x0001;
const int MDITILE_VERTICAL = 0x0000;
const short SWP_ASYNCWINDOWPOS = 0x4000;
try
{
int hWnd;
RECT Rect = new RECT();
Process outlook = new Process();
outlook.StartInfo.FileName = "notepad.exe";
outlook.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
outlook.Start();
IntPtr id = outlook.MainWindowHandle;
if (id != IntPtr.Zero)
{
id = GetForegroundWindow();
SetWindowPos(id, 0, 0, 0, 800, 900, SWP_NOZORDER | SWP_SHOWWINDOW | SWP_ASYNCWINDOWPOS);
}
Thread.Sleep(2000);
Process explorer = new Process();
explorer.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
explorer.StartInfo.FileName = "explorer.exe";
explorer.Start();

IntPtr id2 = explorer.MainWindowHandle;

if (id2 != IntPtr.Zero)
{
id2 = GetForegroundWindow();
SetWindowPos(id2, 0, -800, 0, 800, 900, SWP_NOZORDER | SWP_SHOWWINDOW);
}

TileWindows(id2, MDITILE_VERTICAL, null, 0, null);


Console.Read();

}
catch (Exception ex)
{

}
}

最佳答案

虽然我自己正在用 C# 做同样的事情,即将代码从 C++ 转换为 C#,所以我没有可用的代码,但我可以肯定地提供一些关于如何让它工作的信息。

要平铺多个窗口,您需要在最后一个参数中提供它们的 HWND 值,即 IntPtr[] lpKids,该函数将平铺其 HWND 存在于 lpKids 数组中的所有窗口。uint cKids 必须包含 lpKids 数组中 HWND 的数量。

正确设置这两个参数后,它应该可以正常工作。

一旦我的代码顺利运行,我可能会发布工作代码。

 TileWindows((IntPtr)null, style, rect, (uint)hwndList.Count, lpKids);

在哪里(IntPtr)null 表示您指的是桌面窗口

样式为 MDITILE_VERTICAL 或 MDITILE_HORIZONTAL 以垂直或水平平铺

rect 是一个包含桌面窗口大小的矩形(x,y,width,height)

(uint)hwndList.Count 是您要操作的 HWND 的数量。我使用函数 EnumDesktopWindows() 使用我自己的选择标准得到了这些

lpKids 是一个包含我要操作的 HWND 的数组。

获取我使用的桌面矩形:

    private RECT getRect()
{
RECT rect = new RECT();
rect.y = 0;
rect.x = 0;
rect.width = SystemInformation.VirtualScreen.Width;
rect.height = SystemInformation.VirtualScreen.Height;

return rect;
}

RECT在哪里

        internal struct RECT
{
public int x;
public int y;
public int width;
public int height;
}

希望对您有所帮助。

关于c# - 垂直平铺windows c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39816820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com