gpt4 book ai didi

c# - 在 C# 中使用 SetWindowPos 移动窗口

转载 作者:IT王子 更新时间:2023-10-29 04:30:52 25 4
gpt4 key购买 nike

我有以下代码:

namespace WindowMover
{
using System.Windows.Forms;

static class Logic
{
[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
public static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags);

public static void Move()
{
const short SWP_NOMOVE = 0X2;
const short SWP_NOSIZE = 1;
const short SWP_NOZORDER = 0X4;
const int SWP_SHOWWINDOW = 0x0040;

Process[] processes = Process.GetProcesses(".");
foreach (var process in processes)
{
var handle = process.MainWindowHandle;
var form = Control.FromHandle(handle);

if (form == null) continue;

SetWindowPos(handle, 0, 0, 0, form.Bounds.Width, form.Bounds.Height, SWP_NOZORDER | SWP_SHOWWINDOW);
}
}
}
}

这应该将我桌面上的每个窗口移动到 0,0 (x,y) 并保持相同的大小。我的问题是只有调用应用程序(在 C# 中构建)被移动。

我应该使用 Control.FromHandle(IntPtr) 以外的其他东西吗?这只会找到 dotnet 控件吗?如果可以,我应该使用什么?

此外,SetWindowPos 中的第二个 0 只是一个随机的 int,我不确定要将其用于 int hWndInsertAfter

像 pidgin 这样有多个窗口的进程呢?

最佳答案

只需取出您的 Control.FromHandle 和表单 == null 检查。你应该能够做到:

IntPtr handle = process.MainWindowHandle;
if (handle != IntPtr.Zero)
{
SetWindowPos(handle, 0, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_SHOWWINDOW);
}

如果您添加 SWP_NOSIZE,它不会调整窗口大小,但仍会重新定位。

如果你想影响每个进程的所有窗口,而不仅仅是主窗口,你可能需要考虑使用 P/Invoke with EnumWindows而不是遍历进程列表并使用 MainWindowHandle。

关于c# - 在 C# 中使用 SetWindowPos 移动窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1190423/

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