我不记得在较旧的 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/