Last active
April 25, 2022 06:44
-
-
Save corberan/0282965d2e982002ab1c742517085b11 to your computer and use it in GitHub Desktop.
powershell 和 winapi 的交互,获取窗口大小及边框大小
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using namespace System; | |
using namespace System.Diagnostics; | |
using namespace System.Runtime.InteropServices; | |
param ( | |
[Parameter(Mandatory = $True)] | |
[string]$hWndHexStr | |
) | |
Add-Type -TypeDefinition @" | |
using System; | |
using System.Diagnostics; | |
using System.Runtime.InteropServices; | |
[StructLayout(LayoutKind.Explicit, Size = 16)] | |
public struct RECT | |
{ | |
[FieldOffset(0)] | |
public int left; | |
[FieldOffset(4)] | |
public int top; | |
[FieldOffset(8)] | |
public int right; | |
[FieldOffset(12)] | |
public int bottom; | |
} | |
[StructLayout(LayoutKind.Sequential)] | |
public struct WINDOWINFO | |
{ | |
public uint cbSize; | |
public RECT rcWindow; | |
public RECT rcClient; | |
public uint dwStyle; | |
public uint dwExStyle; | |
public uint dwWindowStatus; | |
public uint cxWindowBorders; | |
public uint cyWindowBorders; | |
public ushort atomWindowType; | |
public ushort wCreatorVersion; | |
} | |
public static class Kernel32 | |
{ | |
[DllImport("kernel32.dll", EntryPoint="GetLastError")] | |
public static extern uint GetLastError(); | |
} | |
public static class User32 | |
{ | |
[DllImport("user32.dll", EntryPoint="GetWindowInfo", SetLastError=true)] | |
public static extern bool GetWindowInfo( | |
IntPtr hWnd, | |
ref WINDOWINFO pwi); | |
} | |
public static class Dwm | |
{ | |
[DllImport("dwmapi.dll", EntryPoint="DwmGetWindowAttribute")] | |
public static extern int DwmGetWindowAttribute( | |
IntPtr hWnd, | |
uint dwAttribute, | |
out RECT pvAttribute, // 参见 http://pinvoke.net/default.aspx/dwmapi.DwmGetWindowAttribute,是分了 RECT 和 bool 两种参数的,而不是 IntPtr | |
uint cbAttribute); | |
} | |
"@ | |
function Get-Pretty-Print { | |
param ( | |
[RECT]$rect | |
) | |
return "($($rect.left), $($rect.top)) - ($($rect.right), $($rect.bottom)) $($rect.right-$rect.left)x$($rect.bottom-$rect.top)" | |
} | |
$hWnd = [Convert]::ToInt64($hWndHexStr, 16) | |
$WindowInfo = New-Object WINDOWINFO | |
$WindowInfo.cbSize = [Marshal]::SizeOf([System.Type] [WINDOWINFO]) | |
$ret = [User32]::GetWindowInfo($hWnd, [ref] $WindowInfo) | |
if (!$ret) { | |
Write-Output "$((New-Object System.ComponentModel.Win32Exception([int][Kernel32]::GetLastError())).Message)" | |
} | |
else { | |
$rcWindow = Get-Pretty-Print -rect $WindowInfo.rcWindow | |
$rcClient = Get-Pretty-Print -rect $WindowInfo.rcClient | |
Write-Output "window: $($rcWindow)" | |
Write-Output "client: $($rcClient)" | |
Write-Output "border: [width: $($WindowInfo.cxWindowBorders), height: $($WindowInfo.cyWindowBorders)]" | |
} | |
New-Variable -Name DWMWA_EXTENDED_FRAME_BOUNDS -Option Constant -Value 0x09 | |
New-Variable -Name S_OK -Option Constant -Value 0 | |
$dwmRect = New-Object RECT | |
$dwmRectSize = [Marshal]::SizeOf([System.Type] [RECT]) | |
$ret = [Dwm]::DwmGetWindowAttribute($hWnd, $DWMWA_EXTENDED_FRAME_BOUNDS, [ref] $dwmRect, $dwmRectSize) | |
if ($ret -eq $S_OK) { | |
$rcDwmWindow = Get-Pretty-Print -rect $dwmRect | |
Write-Output "dwm window: $($rcDwmWindow)" | |
} | |
else { | |
Write-Output "Error code: $($ret.ToString('X'))`r" | |
Write-Output "Check reference https://docs.microsoft.com/en-us/windows/desktop/seccrypto/common-hresult-values" | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment