ToUnicodeEx函数失败,任何键盘布局都不同于我的

时间:2015-07-03 19:58:29

标签: .net vb.net winapi raw-input keyboard-layout

我正在使用var TelegramBot = require('telegrambot'); var api = new TelegramBot('<YOUR TOKEN HERE>'); // You can either use getUpdates or setWebHook to retrieve updates. // getUpdates needs to be done on an interval and will contain all the // latest messages send to your bot. // Update the offset to the last receive update_id + 1 api.invoke('getUpdates', { offset: 0 }, function (err, updates) { if (err) throw err; console.log(updates); }); // The chat_id received in the message update api.invoke('sendMessage', { chat_id: <chat_id>, text: 'my message' }, function (err, message) { if (err) throw err; console.log(message); }); 函数将按下的键的虚拟键码转换为其unicode字符,

这是函数定义:

ToUnicodeEx

此功能适用于我的文化 es-ES ,键盘布局 3082 ,但是,如果改为指定 3082 ,我会尝试使用代码下面指定 1033 键盘布局以模拟 en-US 文化的关键压力,或任何不同于 3082 的任何其他键盘布局,然后{ {1}}函数将失败并返回0,其中返回值0表示:

  

指定的虚拟键没有当前状态的转换   键盘。没有任何内容写入指定的缓冲区   pwszBuff。

<DllImport("user32.dll", CharSet:=CharSet.Auto, ExactSpelling:=True, CallingConvention:=CallingConvention.Winapi)>
Friend Shared Function ToUnicodeEx(
                       ByVal wVirtKey As UInteger,
                       ByVal wScanCode As UInteger,
                       ByVal lpKeyState As Byte(),
                       <Out, MarshalAs(UnmanagedType.LPWStr)>
                       ByVal pwszBuff As StringBuilder,
                       ByVal cchBuff As Integer,
                       ByVal wFlags As UInteger,
                       ByVal dwhkl As IntPtr
) As Integer
End Function

我做错了什么?,我该如何解决?

2 个答案:

答案 0 :(得分:2)

您不能简单地传递一个数字(IntPtr)作为最后一个参数......正如MSDN

所述
  

dwhkl [in,optional]   类型:HKL   用于转换指定代码的输入语言环境标识符。此参数可以是以前由LoadKeyboardLayout函数返回的任何输入区域设置标识符

您必须先使用LoadKeyboardLayout加载布局。

答案 1 :(得分:0)

尝试,重新研究,并且有些失败,我在.Net框架类库中找到了不涉及P / Invoking的最佳和更简单的解决方案。

只需知道一个文化名称,例如 en-US es-ES Systwm.Windows.Forms.InputLanguage类,我们就可以检索布局句柄(HKL)

InputLanguage.FromCulture(New CultureInfo("en-US")).Handle

然后,可以为dwHKL函数的ToUnicodeEx参数设置该值,它可以完美运行!。