我试图使用SetWindowPos
移动VSCode窗口(在PowerShell中,但同样适用于C++或C# PInvoke),但无法使其工作。
更令人沮丧的是,NirSoft的GUIPropView实用程序 * 确实 * 设法以某种方式移动(使用中心选定窗口选项)VSCode窗口。(当然,这个程序没有源代码……)
我可以使用以下PowerShell代码获得某种句柄:
$hwnd = (Get-Process code).MainWindowHandle | where { $_ -ne 0 }
这将产生与使用FindWindow
时相同的句柄(提供窗口类和VSCode示例的标题)。
对SetWindowPos
使用这个句柄除了使SetWindowPos
返回True
之外,什么也做不了(我想,这意味着它至少没有完全失败)。).
$user32 = Add-Type -MemberDefinition @'
[DllImport("user32.dll", SetLastError = true)]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, UInt32 uFlags);
'@ -Name user32 -PassThru
# just some test coordinates and sizes
$user32::SetWindowPos($hwnd, 0, 100, 100, 500, 500, 0)
GUIPropView还提供了另外两个句柄(显示在程序的底部面板中),我不知道它们来自哪里,其中一个允许我调整渲染内容的大小和位置,但不是整个窗口本身,产生如下结果:
”有什么明显的我错过了吗?我应该以不同的方式获取窗口句柄吗?你在干什么?**
1条答案
按热度按时间uubf1zoe1#
结果发现,我用来查找VSCode窗口句柄的代码实际上很好。问题是在窗口仍处于最大化状态时尝试移动/调整窗口大小。(请注意,我测试的其他应用程序,如Firefox,没有任何问题。)
要取消最大化/取消最小化/取消排列窗口,我们可以使用
ShowWindow
和SWP_RESTORE
。完整的脚本如下: