GetKeyboardState用于前台窗口

本文关键字:窗口 前台 用于 GetKeyboardState | 更新日期: 2023-09-27 18:08:58

如何获取前台窗口的键盘状态?我已经搜索过了,但是没有什么有用的

[DllImport("user32.dll")]
public static extern bool GetKeyboardState(byte[] lpKeyState);

获取当前应用程序键盘状态,而不是外部窗口(活动窗口)

更新我已经按照斜杠说的做了,但仍然没有得到任何东西但是当我按照我理解的做时,仍然没有得到任何东西所以有人能告诉我这段代码有什么问题吗

 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;
        }

仍然得到我的应用程序键盘状态而不是前景

GetKeyboardState用于前台窗口

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

Dll导入

    [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