windows - 如何在 Windows 8.1 Update 2 操作系统中使用 PowerShell 环境中的 Win32 API FindWindow() 查找桌面窗口(按窗口名称)?

标签 windows powershell

我不记得在较旧的 Windows 操作系统中找到窗口有任何问题,但是,我在 Windows 8.1 Update 2 操作系统中使用 PowerShell v4.0 没有成功。

这是我正在使用的 PowerShell v4.0 代码(非常简单):

$sig=@'
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(String sClassName, String sAppName);
'@

$fw = Add-Type -Namespace Win32 -Name Funcs -MemberDefinition $sig -PassThru
$wname='Form1' # any existing window name

$fw::FindWindow($null -as [String], $wname) # returns 0, always!

最后一条命令总是返回0

将 DllImport 属性更改为

[DllImport("user32.dll", CharSet = CharSet.Unicode)]

不改变任何东西; 0 以相同的方式返回。

有趣的是,C# 中的等效代码返回正确的 HWND 值。

有谁知道上面的 PowerShell v4.0 代码出了什么问题(以及如何修复)?

最佳答案

First :不是一个答案,而是帮助其他人工作,如果你使用好的类,例如这里我编写 CalcFrame 这是真正的类calc.exe 的主窗口可以正常工作。

$fw::FindWindow("CalcFrame", $wname) # returns the right value for me if calc.exe is started.

第二:以下对我有用;根据 Microsoft documentation第一个参数应该为 null,但根据 PInvok网站 您必须将 IntPtr.Zero 作为第一个参数传递

$sig = @"
  [DllImport("user32.dll", CharSet = CharSet.Unicode)]
  public static extern IntPtr FindWindow(IntPtr sClassName, String sAppName);

  [DllImport("kernel32.dll")]
  public static extern uint GetLastError();
"@

$fw = Add-Type -Namespace Win32 -Name Funcs -MemberDefinition $sig -PassThru
$wname='Calculatrice' # any existing window name

$fw::FindWindow([IntPtr]::Zero, $wname ) # returns the Window Handle
$a = $fw::GetLastError()
$a

关于windows - 如何在 Windows 8.1 Update 2 操作系统中使用 PowerShell 环境中的 Win32 API FindWindow() 查找桌面窗口(按窗口名称)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25780138/

相关文章:

windows - 如何在 powershell 中创建一个简短但仍然唯一的目录名称

c++ - 检测键是否是加载/安装的注册表配置单元的根

windows - Delphi:具有自定义字体颜色的 ListView (vsReport) 单列标题标题?

windows - 为什么我在 Windows 上运行 Perl one liner 时出现“找不到字符串终止符 "'”错误

powershell - 如何在 PowerShell 中更改为临时目录?

Powershell - 从文件导入数据

c++ - Qt Linux/XP 差异 - 使用户无法调整窗口大小

windows - CurrentControlSet 与 ControlSet001 和 ControlSet002 有何不同?

xml - 删除文件中的 XML 字符串

powershell - 从实际变量中获取 powershell 变量名