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

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

我不记得在较老的Windows操作系统中find一个窗口有任何问题,但是,我没有在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属性更改为

如何在PowerShell中下载整个DropBox目录?

Py2Exe:避免Windows请求执行.exe文件的权限

PowerShell Windows安装程序Com对象

PowerShell:导出用户权限分配

使用PowerShell来查找设置为唤醒计算机的计划任务

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

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

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

有谁知道什么是错的(以及如何解决)上面的PowerShell v4.0代码

Azure自定义脚本扩展不断重新启动

networking延迟监视脚本窗口

1 Powershell脚本2 sql

用于创build本地用户并将详细信息写入XML文件的Powershell脚本

Windows PowerShell在命令Enter-PSSession中input密码

第一 :不是一个答案,而是帮助其他人的工作,如果你使用良好的类,例如在这里代码CalcFrame这是calc.exe主窗口的真正的类它的工作。

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

第二 :以下对我有用; 按照Microsoft文档中的第一个参数应该为null,而在PInvok e站点中必须通过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

似乎该方法不会失败,如果,并且只有当ClassName也被指定(不能为null )时才如下例所示:

$sig=@' [DllImport("user32.dll",CharSet = CharSet.Auto)] public static extern IntPtr FindWindow(string lpClassName,string lpWindowName); '@ $w32 = Add-Type -Namespace Win32 -Name Funcs -MemberDeFinition $sig -Passthru $w32::FindWindow('ConsoleWindowClass','Windows PowerShell') # Windows PowerShell Console

如果ClassName为null ,那么JPBlanc的方法就能正常工作,这为方法指定了一个不同的签名。

我看了一下这个问题的C#实现,发现了2个WNDCLASS结构:WNDCLASS_D和WNDCLASS_I。 前者是使用字符串作为类型的传统结构,遵循Win32 API。 但后者使用IntPtr.Zero值为那些采用空字符串值的WNDCLASS结构。 由于这个原因,指定空字符串值将导致发现,因为空字符串值不能隐式转换为IntPtr.Zero。

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

相关推荐