微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

这是我正在使用的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代码有什么问题(以及如何修复)?

解决方法

第一:不是答案,而是帮助其他人工作,如果你使用好的类,例如在这里我编写CalcFrame,它是calc.exe的主窗口的真正类,它的工作原理.

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

第二:以下对我有用;对于Microsoft documentation,第一个参数应为null,但是根据PInvoke站点,您必须将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

原文地址:https://www.jb51.cc/windows/612876.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐