如何在PowerShell中添加并使用C# struct实现WinAPI GetCursorPos调用
PowerShell 中POINT结构体的使用与GetCursorPos调用方案
一、警告原因说明
你删除GetCursorPos定义后触发的警告,是因为使用-MemberDefinition参数时,Add-Type会将传入的代码作为你指定的Win32类的成员内容,此时你仅在类中定义了嵌套的POINT结构体,没有为Win32类本身定义任何公共方法/属性,所以会触发该提示。如果仅需单独定义POINT结构体,使用-TypeDefinition参数即可,不会触发该警告。
二、结构体实例化方法
场景1:和Win32 API一起定义
使用-MemberDefinition参数时,POINT是Win32类的嵌套类型,实例化语法如下:
# 类型定义仅需执行一次 $MethodDefinition=@' [StructLayout(LayoutKind.Sequential)] public struct POINT { public int X; public int Y; } [DllImport("user32.dll")]public static extern bool GetCursorPos(out POINT lpPoint); '@ Add-Type -MemberDefinition $MethodDefinition -Name 'Win32' -NameSpace '' -ErrorAction SilentlyContinue # 实例化嵌套的POINT结构体 $point = New-Object Win32+POINT # 也可以用自定义的有参构造传值 $point = New-Object Win32+POINT(10,20)
场景2:单独定义POINT结构体
使用-TypeDefinition参数时,POINT是全局类型,直接实例化即可:
$StructDefinition=@' [StructLayout(LayoutKind.Sequential)] public struct POINT{ public int X; public int Y; public POINT(int x, int y){this.X=x;this.Y=y;} } '@ Add-Type -TypeDefinition $StructDefinition -ErrorAction SilentlyContinue # 直接实例化 $point = New-Object POINT # 或者使用构造函数传参 $point = [POINT]::new(30,40)
三、GetCursorPos完整调用示例
# 定义类型 $MethodDefinition=@' [StructLayout(LayoutKind.Sequential)] public struct POINT { public int X; public int Y; } [DllImport("user32.dll")]public static extern bool GetCursorPos(out POINT lpPoint); '@ Add-Type -MemberDefinition $MethodDefinition -Name 'Win32' -NameSpace '' -ErrorAction SilentlyContinue # 实例化结构体 $cursorPos = New-Object Win32+POINT # 调用API获取坐标 $callResult = [Win32]::GetCursorPos([ref]$cursorPos) if($callResult){ Write-Host "当前鼠标坐标 X:$($cursorPos.X),Y:$($cursorPos.Y)" }else{ Write-Host "获取鼠标坐标失败" }
内容的提问来源于stack exchange,提问作者Julian
相关产品推荐
相关产品推荐

