zyq*_*zyq 4 windows powershell
我不记得在旧的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!
Run Code Online (Sandbox Code Playgroud)
最后一个命令总是返回0.
将DllImport属性更改为
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
Run Code Online (Sandbox Code Playgroud)
什么都不改变; 0以相同的方式返回.
有趣的是注意到C#中的等效代码,返回正确的HWND值.
有谁知道上面的PowerShell v4.0代码有什么问题(以及如何修复)?
第一:不是答案,而是为了帮助其他人工作,如果你使用好的类,例如在这里,我编写的CalcFrame是calc.exe它的主窗口真正的类.
$fw::FindWindow("CalcFrame", $wname) # returns the right value for me if calc.exe is started.
Run Code Online (Sandbox Code Playgroud)
第二:以下对我有用; 对于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
Run Code Online (Sandbox Code Playgroud)