function Get-KeyboardLayout
{
$Code = @'
using System;
using System.Globalization;
using System.Runtime.InteropServices;
namespace XKeyboardLayout
{
public static class KeyboardLayout
{
[DllImport("user32.dll")] static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")] static extern uint GetWindowThreadProcessId(IntPtr hwnd, IntPtr proccess);
[DllImport("user32.dll")] static extern IntPtr GetKeyboardLayout(uint thread);
public static CultureInfo GetCurrentKeyboardLayout()
{
try
{
IntPtr foregroundWindow = GetForegroundWindow();
uint foregroundProcess = GetWindowThreadProcessId(foregroundWindow, IntPtr.Zero);
int keyboardLayout = GetKeyboardLayout(foregroundProcess).ToInt32() & 0xFFFF;
return new CultureInfo(keyboardLayout);
}
catch
{
return new CultureInfo(1033); // Assume English if something went wrong.
}
}
}
}
'@
Add-Type -TypeDefinition $Code -Language CSharp -IgnoreWarnings
[XKeyboardLayout.KeyboardLayout]::GetCurrentKeyboardLayout()
}