C#使用win32api设置命令窗体位置时失效

问题遇到的现象和发生背景

C#使用win32api设置命令窗体位置时失效

问题相关代码,请勿粘贴截图

[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
调用方式
//Win32ApiTool.MoveWindow(intPtr, 0, 0, 1920, 1080, true);
Win32ApiTool.SetWindowPos(intPtr, (IntPtr)Win32ApiTool.HWND_TOP, 0, 0, s.Width, s.Height, Win32ApiTool.SWP_SHOWWINDOW );

运行结果及报错内容

命令窗体的大小生效了 但是位置无效

img

我的解答思路和尝试过的方法

尝试过
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint);
也是这样的

使用下面代码获取位置 确实是离顶部和左边有距离
// 获取置顶窗口位置
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);

我想要达到的结果

目前来说资源管理器 浏览器、自己的窗体等等都可以正常使用 就唯独命令窗体无法修改显示位置

已解决 换了下思路
既然可以改变大小说明句柄拿到了
故采取
//先让其忽略大小改变位置 在让其忽略位置改变大小 便可实现位置和大小的改变
Win32ApiTool.SetWindowPos(intPtr, (IntPtr)Win32ApiTool.HWND_TOP, s.X, s.Y, s.Width, s.Height, Win32ApiTool.SWP_SHOWWINDOW | Win32ApiTool.SWP_NOSIZE);
Win32ApiTool.SetWindowPos(intPtr, (IntPtr)Win32ApiTool.HWND_TOP, s.X, s.Y, s.Width, s.Height, Win32ApiTool.SWP_SHOWWINDOW | Win32ApiTool.SWP_NOMOVE);

控制台窗口??
这个比较特殊了,控制台本身没有MainWindowHandle

所以想控制控制台类的,必须先拿到正确的控制台句柄

这里有几篇参考


以前回答另一个问题的代码,获取控制台句柄并置回顶部焦点
https://stackoverflow.com/questions/5711291/get-the-handle-and-write-to-the-console-that-launched-our-process
https://stackoverflow.com/questions/1277563/how-do-i-get-the-handle-of-a-console-applications-window
上面是老外的回答,基本大同小异,对于控制台的句柄进行特殊对待

附加一些官方说明:官方的和控制台相关的api