electron SetWindowPos不适用于VSCode窗口

b1payxdu  于 2023-09-28  发布在  Electron
关注(0)|答案(1)|浏览(145)

我试图使用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还提供了另外两个句柄(显示在程序的底部面板中),我不知道它们来自哪里,其中一个允许我调整渲染内容的大小和位置,但不是整个窗口本身,产生如下结果:

”有什么明显的我错过了吗?我应该以不同的方式获取窗口句柄吗?你在干什么?**

uubf1zoe

uubf1zoe1#

结果发现,我用来查找VSCode窗口句柄的代码实际上很好。问题是在窗口仍处于最大化状态时尝试移动/调整窗口大小。(请注意,我测试的其他应用程序,如Firefox,没有任何问题。)
要取消最大化/取消最小化/取消排列窗口,我们可以使用ShowWindowSWP_RESTORE
完整的脚本如下:

$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);

[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
'@ -Name user32 -PassThru

$hwnd = (Get-Process code).MainWindowHandle | Where-Object { $_ -ne 0 }

$user32::ShowWindow($hwnd, 0x0009 <# SW_RESTORE #>);
$user32::SetWindowPos($hwnd, 0, 100, 100, 500, 500, 0);

相关问题