【发布时间】:2012-06-01 21:31:38
【问题描述】:
我正在使用此代码将虚拟键转换为 WideString:
function VKeytoWideString (Key : Word) : WideString;
var
WBuff : array [0..255] of WideChar;
KeyboardState : TKeyboardState;
UResult : Integer;
begin
Result := '';
GetKeyBoardState (KeyboardState);
ZeroMemory(@WBuff[0], SizeOf(WBuff));
UResult := ToUnicode(key, MapVirtualKey(key, 0), KeyboardState, WBuff, Length(WBuff), 0);
if UResult > 0 then
SetString(Result, WBuff, UResult)
else if UResult = -1 then
Result := WBuff;
end;
它在我的电脑上运行良好,但在中国电脑上我得到了这个:
它将中文字符转换为汉语拼音。我认为该函数实际上返回了键盘的原始输入,而不是用户真正想要输入的内容。
我应该如何处理?
【问题讨论】:
-
Stack Overflow 上的大多数人不会阅读中文,因此无法识别您显示的输出的问题。 (对我来说它看起来像中文!有什么问题?)你能告诉你给你的函数什么输入,你得到什么输出,以及你期望或希望收到什么?提及数字字符代码可能会有所帮助。
-
我也不能告诉你太多。一位朋友在中文 Windows XP 上测试了我的程序,我在 KeyDown 事件中使用了 Delphi7 的 TNTMemo(将密钥作为单词返回)。之后,我使用上面的功能转换密钥并将其放入备忘录中。我的朋友说备忘录中应该有汉字,就像他在windows中的记事本上一样。但相反,它向他显示了他输入的汉语拼音。
-
一个 KeyDown 事件可以导致 0、1 或更多 KeyPress 事件。这种转换非常复杂,Windows 会为您执行。你为什么要复制它?是不是不能听 KeyPress 事件而不是 KeyDown 事件?
-
@BenjaminWeiss 不同的是,在 KeyPress 事件中,虚拟键码已经转换为字符,并且您只能获取与字符对应的键的事件。因此,如果在美国国际布局上按下
',您将获得一个 KeyDown 事件、没有 KeyPress 事件和一个 KeyUp 事件。然后按下x,你会得到另一个KeyDown 事件,接着是两个KeyPress 事件('和x),最后是x 的一个KeyUp 事件。使用相同的布局键入'a会导致KeyDown(')KeyUp(')KeyDown(a)KeyPress(á)KeyUp(a)。 (这有点简化,但基本思想。) -
@BenjaminWeiss:GetKeyboardLayout
标签: delphi unicode keyboard cjk