【问题标题】:Strange WM_CHAR behaviour (wrong chCharCode)奇怪的 WM_CHAR 行为(错误的 chCharCode)
【发布时间】:2012-10-08 21:43:07
【问题描述】:

我需要自动输入某个字符(俄语字母Э)。在 Spy++ 中,相应的消息如下所示:

WM_CHAR chCharCode: '221' (221) cRepeat:1 ScanCode:28 fExtended:0 fAltDown:0 fRepeat:0 fUp:0

为了以编程方式发送此消息,我使用以下 Delphi 代码:

SendMessage(Self.PassengerGrid, WM_CHAR, WPARAM(221), LPARAM($280001));

当我检查在 Spy++ 中运行代码的结果时,我看到以下消息:

WM_CHAR chCharCode: '89' (89) cRepeat:1 ScanCode:28 fExtended:0 fAltDown:0 fRepeat:0 fUp:0

我的SendMessage 通话中的wParam 一定有问题。

我该如何修复它(使chCharcode 等于221)`?

更新 1:

  • 出现此错误的机器有两种键盘语言 - 英语和俄语。
  • 我注意到当下面的代码

    SendMessage(MyGridHandle, WM_KEYDOWN, VK_OEM_7, LPARAM($390000)); SendMessage(MyGridHandle, WM_CHAR, WPARAM(221), LPARAM($280001)); SendMessage(MyGridHandle, WM_KEYUP, VK_OEM_7, LPARAM($c0390001));

执行后,所选语言(根据托盘图标)从俄语变为英语。

  • 无论我在 WM_CHAR 中传输什么字符,消息的WPARAM 始终是0x59 (89)。

更新 2: 使用 WM_UNICHAR 代替 WM_CHAR 没有帮助。

【问题讨论】:

  • 检查Spy++中的Wparam参数,不会是221。请查阅手册:msdn.microsoft.com/en-us/library/windows/desktop/…
  • 请看截图。当我手动输入字母 Э 时,它会显示键盘消息。
  • @DmitriPisarenko 你也可以看看SendInput。它专门用于将击键(和其他输入)发送到外部应用程序。
  • @whosrdaddy WPARAM 等于 0xDD (221)。
  • @satuon SendInput 是否在目标应用程序专注时工作?

标签: delphi winapi delphi-2009


【解决方案1】:

您应该将字符的 UTF-16 代码作为 WPARAM 发送(即俄语“Э”的 1069),例如:

procedure TForm1.Button1Click(Sender: TObject);
begin
  PostMessage(Edit1.Handle, WM_CHAR, WPARAM(1069), LPARAM(0));//$280001));
end;

【讨论】:

  • 在最近的 Delphi 版本中,您也可以只输入 PostMessage(Edit1.Handle, WM_CHAR, WPARAM('Э'), LPARAM(0));
  • @DanBartlett - 你的代码对我来说在 Delphi XE 上不起作用(WPARAM('Э') = 221)。
猜你喜欢
  • 1970-01-01
  • 2012-11-26
  • 2015-07-27
  • 2015-12-05
  • 2020-09-02
  • 2012-12-27
  • 1970-01-01
  • 2014-10-06
  • 2018-10-19
相关资源
最近更新 更多