You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 18:36:03