Delphi 奇怪的WM_字符行为(错误的chCharCode)

Delphi 奇怪的WM_字符行为(错误的chCharCode),delphi,winapi,delphi-2009,Delphi,Winapi,Delphi 2009,我需要自动输入某个字符(俄语字母ª)。在Spy++中,相应的消息如下所示: WM_CHAR chCharCode:'221'(221)重复:1扫描代码:28扩展:0故障:0故障:0故障:0故障:0故障 为了以编程方式发送此消息,我使用以下Delphi代码: SendMessage(Self.PassengerGrid、WM_CHAR、WPARAM(221)、LPARAM($280001)) 当我检查在Spy++中运行代码的结果时,我看到以下消息: WM_CHAR chCharCode:'89'

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

WM_CHAR chCharCode:'221'(221)重复:1扫描代码:28扩展:0故障:0故障:0故障:0故障:0故障

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

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

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

WM_CHAR chCharCode:'89'(89)重复:1扫描代码:28扩展:0故障:0故障:0重复:0 fUp:0

我的
SendMessage
调用的
wParam
一定有问题

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

更新1:

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

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

执行时,所选语言(根据托盘图标)从俄语更改为英语

  • 无论我在WM_CHAR中传输什么字符,消息的WPARAM总是
    0x59
    89

更新2:使用
WM_UNICHAR
而不是
WM_CHAR
没有帮助。

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


在Spy++中检查Wparam参数,它不会是221。请参考手册:请看屏幕截图。当我手动键入字母
ª
时,它会显示键盘消息。@DmitriPisarenko您也可以查看。它专门用于向外部应用程序发送击键(和其他输入)。@whosrdaddy WPARAM等于
0xDD
(221)。@satuon在目标应用程序未聚焦时是否执行
SendInput
?在最新的Delphi版本中,您也可以只键入PostMessage(Edit1.Handle,WM_CHAR,WPARAM('urn'),LPARAM(0))@DanBartlett-您的代码在Delphi XE上对我来说不起作用(WPARAM('CharStyle')=221)。
procedure TForm1.Button1Click(Sender: TObject);
begin
  PostMessage(Edit1.Handle, WM_CHAR, WPARAM(1069), LPARAM(0));//$280001));
end;