2012-10-18 150 views
1

我需要自动输入某个字符(俄文字母Э)。在间谍++对应的消息是这样的:奇怪的WM_CHAR行为(错误的chCharCode)

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

enter image description here

为了编程方式发送这个消息,我用这个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));

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

  • 不管字符I在WM_CHAR发送,该消息的WPARAM总是0x5989)。

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

+0

支票间谍++ wParam参数,它不会是221请请查阅说明书:http://msdn.microsoft.com/en-us/library/windows/desktop/ms646268%28v=vs.85%29.aspx – whosrdaddy

+0

请看截图。它显示键盘消息,当我手动输入字母“Э”时。 –

+0

@DmitriPisarenko您可能还会看[SendInput](http://msdn.microsoft.com/en-us/library/ms646310%28VS.85%29.aspx)。它专门用于将按键(和其他输入)发送到外部应用程序。 – sashoalm

回答

3

你应该发送一个字符的UTF-16代码WPARAM(即1069俄罗斯“Э”),例如:

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

在最近的Delphi版本中,您也可以键入PostMessage(Edit1.Handle,WM_CHAR,WPARAM('Э'),LPARAM(0)); –

+0

@DanBartlett - 你的代码不适用于我的Delphi XE(WPARAM('Э')= 221)。 – kludg