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