C# 从windows中提取键盘布局

C# 从windows中提取键盘布局,c#,winforms,keyboard-layout,C#,Winforms,Keyboard Layout,好的,这是一个有点奇怪的问题 我们有一个触摸屏应用程序(即,没有键盘)。当用户需要输入文本时,应用程序会显示WinForms中的虚拟键盘 为每一种新的语言手工制作这些东西是一件愚蠢的工作。我认为windows必须将键盘布局信息隐藏在某个dll中。是否有办法从windows中获取此信息 欢迎其他想法(我认为至少从xml文件生成东西要比在VS中手工生成要好) (注意:说到这里,我注意到有一个日语键盘、状态机和所有…,所以XML可能不够) 更新:关于这个主题的系列文章不错(我相信)请查看以下Windo

好的,这是一个有点奇怪的问题

我们有一个触摸屏应用程序(即,没有键盘)。当用户需要输入文本时,应用程序会显示WinForms中的虚拟键盘

为每一种新的语言手工制作这些东西是一件愚蠢的工作。我认为windows必须将键盘布局信息隐藏在某个dll中。是否有办法从windows中获取此信息

欢迎其他想法(我认为至少从xml文件生成东西要比在VS中手工生成要好)

(注意:说到这里,我注意到有一个日语键盘、状态机和所有…,所以XML可能不够)


更新:关于这个主题的系列文章不错(我相信)

请查看以下Windows API

 [DllImport("user32.dll")]
 private static extern long LoadKeyboardLayout(string pwszKLID, uint Flags);

检查

为什么不使用屏幕键盘(osk.exe)?看起来你在发明轮子。而且不是最简单的

可以加载系统键盘并将其导出为。因为它是用.NET编写的,所以您可以使用它来查看它是如何做到这一点的,并使用反射来驱动它。下面是一个使用以下C代码创建的示例。请注意,我最初是为Windows XP编写的,现在使用Windows 8和屏幕键盘,速度非常慢,似乎会使任务栏崩溃:/然而,它确实可以工作:)


基本上,它会获得系统上所有键盘的列表,然后针对每个键盘,将其加载到MSKLC中,设置“另存为”文件名,确定是否已配置自定义键盘属性,然后模拟单击“文件->保存”菜单项。

我知道这些DLL文件的路径在哪里:

在注册表中,您可以看到:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts
其中每个分支都有一些值,如
“Layout File”=“KBDSP.dll”
。根目录是

C:\Windows\System32

这些都是键盘布局文件所在的位置。例如,
KBDUS.dll
表示“我们的键盘”

我试图用MSKLC制作的自定义DLL替换DLL文件,发现它以“语言”-“输入法”-“预览”自动加载布局映射图像:


所以我们知道映射在DLL中

众所周知,MSKLC无法为Windows提供的所有.DLL文件(尤其是Windows 8及以上版本中的文件)忠实地导入和复制键盘布局。如果不能从这些文件中提取任何有意义或有用的信息,那么知道这些文件在哪里也没有任何好处。 这是迈克尔·卡普兰在他的博客(他是MSKLC的开发者)上记录的,我看到你已经链接到上面了

当MSKLC遇到任何它不理解的内容时,该部分将被删除。 使用MSKLC提取布局适用于大多数键盘,但也有一些键盘——即切诺基键盘和日韩键盘(仅举几个例子,我不确定还有多少)——提取的布局无法准确或完全反映键盘的实际使用情况和功能。 切诺基键盘有链锁死键,MSKLC不支持。而远东键盘有MSKLC不知道的修改键——这意味着整个图层/移位状态都丢失了

迈克尔·卡普兰(Michael Kaplan)提供了一些代码,并解开了MSLKC和附带软件的一些秘密,这些软件可以用来绕过这些限制,但它需要相当多的手工操作——这正是您试图避免的!此外,Michael的目标是创建具有MSKLC无法创建或理解的功能的键盘,但这些功能可以在Windows中工作(这与OP试图实现的功能相反)

我确信我的解决方案来得太晚,对OP没有用处,但也许它在将来对类似情况的人会有所帮助。这是我的希望,也是我发表这篇文章的原因

到目前为止,我所做的只是解释其他答案是不够的。即使是最好的一个也不会也不能完全准确地复制Windows的所有本机键盘,并将它们渲染成KLC源文件。这真的很不幸,这肯定不是作者的错,因为这是一段非常聪明的代码/脚本!谢天谢地,脚本和源文件(其链接可能仍然有效,也可能仍然有效)对于大多数Windows键盘以及MSKLC创建的任何自定义键盘都是有用和有效的

具有MSKLC不支持的高级功能的键盘是由Windows DDK创建的,但这些功能没有正式的文档记录。尽管通过研究MSKLC提供的源文件,可以了解它们的潜力

遗憾的是,我能提供的唯一解决方案是第三方付费软件。我相信这是目前唯一一个能够忠实地解码和重新创建Windows提供的任何键盘的可用解决方案,尽管有一些高级功能,即使是它也无法复制(例如执行特殊母语功能的组合键/热键;例如:Ctrl+CapsLock以激活假名锁(日语修改器层).KbdEdit确实忠实地再现了MSKLC去掉的修改器层,但如果您没有带假名锁键的日语键盘,它就不支持这种激活移位状态的替代方法。尽管它允许您将键盘上的键转换为假名键(可能是滚动锁?)

幸运的是,这些不受支持的功能甚至都不适用于屏幕键盘

KbdEdit是一个非常强大和神奇的工具,我为它付出的每一分钱都是物有所值的!(对于其他付费软件,我几乎不会这么说……) 尽管KbdEdit是第三方软件,但它只需要创建键盘,不需要使用键盘。它创建的所有键盘都可以在任何Windows系统上本机工作
C:\Windows\System32
C:\Windows\SystemWOW64