C# 前台窗口的GetKeyboardState

C# 前台窗口的GetKeyboardState,c#,winapi,C#,Winapi,如何获取前台窗口的键盘状态? 我已经找过了,但没有任何帮助 [DllImport("user32.dll")] public static extern bool GetKeyboardState(byte[] lpKeyState); 获取当前应用程序键盘状态,而不是外部窗口或活动窗口 更新 我已经按照slashy说的做了,但是仍然什么也没有得到,但是当我理解的做了,仍然什么也没有得到,所以有人能告诉我这个代码有什么问题吗 public static char GetCharFromKey

如何获取前台窗口的键盘状态? 我已经找过了,但没有任何帮助

[DllImport("user32.dll")]
public static extern bool GetKeyboardState(byte[] lpKeyState);
获取当前应用程序键盘状态,而不是外部窗口或活动窗口

更新 我已经按照slashy说的做了,但是仍然什么也没有得到,但是当我理解的做了,仍然什么也没有得到,所以有人能告诉我这个代码有什么问题吗

 public static char GetCharFromKey(Key key)
        {
            char ch = ' ';

            int virtualKey = KeyInterop.VirtualKeyFromKey(key);


            uint x = GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero);


            uint scanCode = MapVirtualKey((uint)virtualKey, MapType.MAPVK_VK_TO_VSC);

            StringBuilder stringBuilder = new StringBuilder(2);

            int result = ToUnicode((uint)virtualKey, scanCode, Encoding.ASCII.GetBytes(GetKeyboardLayout(x).ToString()), stringBuilder, stringBuilder.Capacity, 0);

            switch (result)
            {
                case -1:
                    break;
                case 0:
                    break;
                case 1:
                    {
                        ch = stringBuilder[0];
                        break;
                    }
                default:
                    {
                        ch = stringBuilder[0];
                        break;
                    }
            }

            return ch;
        }

仍然获取我的应用程序键盘状态而不是前台

您应该首先获取窗口处理程序,然后查找键盘状态:

Dll导入

代码:


我猜你说的活动窗口实际上是指前景窗口你说的活动窗口的键盘状态是什么意思?GetKeyboardState返回256个虚拟键的状态。因此,如果按下SHIFT键,所有窗口都会被按下。当然,foreground调用@HansPassant所说的AttachThreadInput以将线程、GetCurrentThreadId附加到前台窗口的线程,由GetForegroundIndow和GetWindowThreadProcessId获得,然后,当你调用GetKeyboardState时,你会得到@IInspectable所建议的前台窗口的键盘状态。我假设,因为它甚至没有尝试回答这个问题。问题是询问键盘状态。您已经回答了如何获得键盘布局。很抱歉@slashy无法解决我的问题,它仍然获得状态或我的应用程序不是前台,我真的不知道为什么!
    [DllImport("user32.dll")]
    private static extern IntPtr GetForegroundWindow();
    [DllImport("user32.dll")]
    static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);
    [DllImport("user32.dll")]
    static extern IntPtr GetKeyboardLayout(uint idThread); 
uint x = GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero);

  keyboard = GetKeyboardLayout(x).ToString();//holds the state