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

48 篇文章 11 订阅

一、目的:在应用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、~等按键存在问题后续更新

六、代码下载

GitHub - HeBianGu/WPF-SystemKeyboard: WPF开发的用户键盘支持复合按键

需要了解的知识点

System.Windows.Controls 命名空间 | Microsoft Learn

了解更多

GitHub - HeBianGu/WPF-ControlDemo: 示例

GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库

GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库

System.Windows.Controls 命名空间 | Microsoft Learn

HeBianGu (HeBianGu) · GitHub

HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频

 

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
可以使用WPF中的Button控件来实现数字键盘。以下是一个简单的示例: 首先,在你的WPF窗体中添加一个Grid控件,然后将8个Button控件放在Grid控件中,每个Button控件显示一个数字。示例代码如下: ```xml <Grid> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition /> <RowDefinition /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <Button Content="1" Grid.Row="0" Grid.Column="0" /> <Button Content="2" Grid.Row="0" Grid.Column="1" /> <Button Content="3" Grid.Row="0" Grid.Column="2" /> <Button Content="4" Grid.Row="1" Grid.Column="0" /> <Button Content="5" Grid.Row="1" Grid.Column="1" /> <Button Content="6" Grid.Row="1" Grid.Column="2" /> <Button Content="7" Grid.Row="2" Grid.Column="0" /> <Button Content="8" Grid.Row="2" Grid.Column="1" /> <Button Content="9" Grid.Row="2" Grid.Column="2" /> </Grid> ``` 然后,你可以为每个Button控件的Click事件添加一个事件处理程序,以便在用户单击数字键时执行相应的操作。例如,你可以将数字键的值添加到TextBox控件中。示例代码如下: ```xml <Grid> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition /> <RowDefinition /> <RowDefinition /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <TextBox x:Name="NumberTextBox" Grid.Row="0" Grid.ColumnSpan="3" /> <Button Content="1" Grid.Row="1" Grid.Column="0" Click="NumberButton_Click" /> <Button Content="2" Grid.Row="1" Grid.Column="1" Click="NumberButton_Click" /> <Button Content="3" Grid.Row="1" Grid.Column="2" Click="NumberButton_Click" /> <Button Content="4" Grid.Row="2" Grid.Column="0" Click="NumberButton_Click" /> <Button Content="5" Grid.Row="2" Grid.Column="1" Click="NumberButton_Click" /> <Button Content="6" Grid.Row="2" Grid.Column="2" Click="NumberButton_Click" /> <Button Content="7" Grid.Row="3" Grid.Column="0" Click="NumberButton_Click" /> <Button Content="8" Grid.Row="3" Grid.Column="1" Click="NumberButton_Click" /> <Button Content="9" Grid.Row="3" Grid.Column="2" Click="NumberButton_Click" /> </Grid> ``` 在代码中,你需要实现NumberButton_Click事件处理程序,该程序将数字键的值添加到TextBox控件中。示例代码如下: ```csharp private void NumberButton_Click(object sender, RoutedEventArgs e) { Button button = (Button)sender; NumberTextBox.Text += button.Content.ToString(); } ``` 这样,你就可以创建一个简单的数字键盘,允许用户输入数字。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值