I don't remember having any problem finding a window in older Windows OS's, but, I'm not succeeding in Windows 8.1 Update 2 OS, using PowerShell v4.0.
This is the PowerShell v4.0 code I'm using (pretty much trivial):
$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!
The last command returns 0, always.
Changing the DllImport attribute to
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
does not change anything; 0 is returned the same way.
Interesting to notice that the equivalent code in C#, returns the correct HWND value.
Does anyone know what's wrong (and how to fix) the PowerShell v4.0 code above?
First : not an answer but to help other people working on it, if you use the good class, for example here I code CalcFrame
wich is the real class of the main window of calc.exe
it works.
$fw::FindWindow("CalcFrame", $wname) # returns the right value for me if calc.exe is started.
Second : The following works for me ; accordind to Microsoft documentation the first parameter should be null, but accordin to PInvoke site you must pass IntPtr.Zero as the first parameter.
$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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With