示例:WPF仿制OSK做的系统键盘和数字键盘

一、目的:在应用osk.exe系统键盘时遇到很多不方便,比如有些系统调用不出来等问题,由此开发了一个系统键盘仿制osk

二、实现功能

       1、目前实现大部分osk键盘的输入功能,还有部分按键由于时间关系没有实现

       2、支持组合按键shift、ctrl、alt等方式输入

       3、支持大小写输入切换

       4、支持shift切换复合按键

       5、支持在外部记事本、网页等有光标的位置进行输入

三、示意图

系统键盘部分:

数字键盘部分:

四、实现部分

1、采用模拟虚拟按键方式输入按键

    public static partial class KeyHelper
    {
        [DllImport("user32.dll", EntryPoint = "keybd_event")]
        public static extern void keybd_event(
        byte bVk, //虚拟键值  
        byte bScan,// 一般为0  
        int dwFlags, //这里是整数类型 0 为按下,2为释放  
        int dwExtraInfo //这里是整数类型 一般情况下设成为0  
        );

        [DllImport("user32.dll")]
        public static extern int GetFocus();
    }

2、通过禁用窗体获取焦点方式来进行外部输入,如记事本

    private void KeyBoardWindow_Loaded(object sender, RoutedEventArgs e)
        {
            WindowInteropHelper windowInteropHelper = new WindowInteropHelper(this);

            IntPtr intPtr = windowInteropHelper.Handle;

            int value = -20;

            SetWindowLong(intPtr, value, (IntPtr)0x8000000);
        }
        [DllImport("user32.dll")]
        public static extern int SetWindowLong(IntPtr hWnd, int nindex, IntPtr dwNewLong);

        [DllImport("user32.dll", SetLastError = true)]
        public static extern UInt32 GetWindowLong(IntPtr hWnd, int index);

五、待实现部分

目前Capslock、ctrl、shift、alt的按下状态和按键状态没有和外部硬件键盘做同步、后续会应用钩子检测同步外部硬件键盘状态

有些按键如win、fn、~等按键存在问题后续更新

六、代码下载

https://github.com/HeBianGu/WPF-SystemKeyboard.git

猜你喜欢

转载自blog.csdn.net/u010975589/article/details/86551944