windows - 如何从 Powershell 调用 GetStdHandle、GetConsoleMode?

标签 windows powershell pinvoke

尝试使用 the Add-Type approach 从 Powershell 脚本读取当前 Windows 控制台模式时出现错误:

$MethodDefinitions = @'
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr GetStdHandle(int nStdHandle);
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode);
'@
$Kernel32 = Add-Type -MemberDefinition $MethodDefinitions -Name 'Kernel32' -Namespace 'Win32' -PassThru
$hConsoleHandle = $Kernel32::GetStdHandle(-11) # STD_OUTPUT_HANDLE 
$lpMode = 0
$Kernel32::GetConsoleMode($hConsoleHandle, $lpMode)

但我收到以下警告和错误:

WARNING: The generated type defines no public methods or properties.
Method invocation failed because [Win32.Kernel32] does not contain a method named 'GetStdHandle'.
At C:\Users\John\get_console_mode.ps1:8 char:1
+ $hConsoleHandle = $Kernel32::GetStdHandle(-11) # STD_OUTPUT_HANDLE
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

Method invocation failed because [Win32.Kernel32] does not contain a method named 'GetConsoleMode'.
At C:\Users\John\get_console_mode.ps1:10 char:1
+ $Kernel32::GetConsoleMode($hConsoleHandle, $lpMode)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

知道我做错了什么吗?

更新:根据已接受的答案,这是更正后的代码:

$MethodDefinitions = @'
[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr GetStdHandle(int nStdHandle);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode);
'@
$Kernel32 = Add-Type -MemberDefinition $MethodDefinitions -Name 'Kernel32' -Namespace 'Win32' -PassThru
$hConsoleHandle = $Kernel32::GetStdHandle(-11) # STD_OUTPUT_HANDLE 
$mode = 0
$Kernel32::GetConsoleMode($hConsoleHandle, [ref]$mode)

最佳答案

尝试使用以下方法定义(我刚刚添加了 public 访问修饰符)

$MethodDefinitions = @'
[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr GetStdHandle(int nStdHandle);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode);
'@

关于windows - 如何从 Powershell 调用 GetStdHandle、GetConsoleMode?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38045245/

相关文章:

c++ - 与 VS2013 相比,gcc 4.7.2 中的 std::map 实现效率非常低?

java - Ant 无法删除 Windows 上的某些文件

c++ - Windows GUI 以及控制台应用程序

powershell - 显示目录中文件的哈希值

c# - BitBlt 代码不工作

.net - 将焦点切换到另一个应用程序的正确方法(在 .NET 中)

c# - 删除 WCFTestClient 的缓存 - 适用于 Visual Studio 2010

.net - 使用.NET复制管理对象RMO的Powershell问题

powershell - 将用户/计算机的OU添加到安全组

c# - 从 C# 调用接受调用者分配的结构数组的 C 函数